Uruchom program z dowolnego miejsca bez zmiany katalogu

8

Chcę utworzyć alias, który uruchamia program x, bez zmiany bieżącego katalogu, w którym się znajduję. Mam teraz:

alias x = "cd /home/path_to_x && ./x"

To działa, ale zmienia mój katalog. To, co chcę zrobić, to coś w stylu:

alias x="./home/path_to_x/x

Ale nie dostaję takiego pliku lub katalogu. Ktoś zna obejście tego problemu?

    
zadawane TheFisherman 15.10.2014, 10:00
źródło

5 odpowiedzi

13

NIE CD, po prostu uruchom go, używając ścieżki bezwzględnej

Ta wersja:

cd /home/path_to_x && ./x

zmienia katalog na bezwzględną ścieżkę (widzisz, jak /home/... zaczyna się w katalogu głównym), a następnie uruchamia plik wykonywalny w względnej ścieżce ./x (czyli w stosunku do nowego działającego katalog).

Ta wersja:

./home/path_to_x/x

próbuje uruchomić plik wykonywalny w względnej ścieżce ./home/path_to_x/x , co oznacza względny dowolny aktualny katalog roboczy . To wyjaśnia, dlaczego dostałeś błąd - ta względna ścieżka naprawdę nie istnieje.

Wymagane polecenie:

/home/path_to_x/x

ponownie używa ścieżki bezwzględnej (zaczynając od katalogu głównego / ).

Och, możesz też dodać /home/path_to_x do PATH zamiast tworzyć alias.

    
odpowiedział Useless 15.10.2014, 18:56
źródło
7

Jeśli nie chcesz, aby cd pozostało po substytucji aliasu, użyj podpowłoki z ( y ) :

alias my_x="(cd /home/path_to_x && ./x)&" 

możesz to sprawdzić za pomocą

alias test_y="(cd /tmp && sleep 10 ) & "

Zwróć uwagę, że rozwiązanie

alias my_y="/home/path_to_x/x" 

nie jest dokładnie równoważny. W rzeczywistości, jeśli wywołany przez my_x , program x jest uruchamiany z bieżącym katalogiem /home/path_to_x/ , a jeśli jest wywołany przez my_y , x jest uruchamiany z bieżącym katalogiem, który jest tym, w którym polecenie my_y zostało wydane. Może to być ważne lub nie w zależności od tego, co robi x .

Informacje o rozwiązaniu OP działają w bash :

romano@RRyS:~$ pwd
/home/romano
romano@RRyS:~$ alias x="cd /bin && ./echo A >/dev/null  &"
romano@RRyS:~$ x
[1] 16611
romano@RRyS:~$ pwd
/home/romano

ale nie w zsh :

[romano:~] % pwd
/home/romano
[romano:~] % alias x="cd /bin && ./echo A >/dev/null &"
[romano:~] % x
[1] 16744
[1]  + 16744 done       ./echo A > /dev/null                                    
1& [romano:/bin] % pwd
/bin
[romano:/bin] % 

Wygląda na to, że bash i zsh wykonują listy na różne sposoby ... więc lepiej dodać wyraźny nawias ... dzięki @EliahKagan za skierowanie go do mnie.

    
odpowiedział Rmano 15.10.2014, 10:38
źródło
3

Umieszczenie & na końcu wydaje się zdziałać:

alias x = "cd /home/path_to_x && ./x &"
    
odpowiedział TheFisherman 15.10.2014, 10:05
źródło
3

Jeśli plik, który chcesz uruchomić, jest już gotowy do wykonania, dlaczego nie dodasz go do zmiennej PATH?

Jeśli twój plik wykonywalny to /home/user/aplication/appX , po prostu wpisz

PATH=$PATH:/home/user/application

do ~/.bashrc lub ~/.profile

Po zrestartowaniu konsoli możesz uruchomić ją po prostu z appX

Myślę, że to najbardziej czyste rozwiązanie.

    
odpowiedział 0xAffe 15.10.2014, 19:11
źródło
0

Uzyskaj kopię zapasową bieżącego pwd i i po uruchomieniu polecenia, cofnij ostatni plik pwd.

alias x='dwp=$(pwd) && cd /home/path_to_x && ./x && cd $dwp'
    
odpowiedział αғsнιη 15.10.2014, 17:57
źródło

Przeczytaj inne pytania na temat tagów