Chcę utworzyć alias, który uruchamia program x, bez zmiany bieżącego katalogu, w którym jestem. Mam teraz:
alias x = "cd /home/path_to_x && ./x"
To działa, ale zmienia mój katalog. Chciałbym coś takiego:
alias x="./home/path_to_x/x
Ale wtedy nie otrzymuję takiego pliku ani katalogu. Czy ktoś zna obejście tego problemu?
command-line
alias
Rybak
źródło
źródło
alias x='/home/path_to_x/x'
. Nie używaj.
wcześniej/home
..
(kropka) oznacza bieżący katalog.x
naprawdę trzeba biec podczas pobytu/home/path_to_x
? A może po prostu nie wiesz, jak uruchomić program znajdujący się w określonym katalogu?Odpowiedzi:
NIE CD, po prostu uruchom go przy użyciu absolutnej ścieżki
Ta wersja:
zmienia katalog na ścieżkę bezwzględną (widzisz, jak
/home/...
zaczyna się w katalogu głównym), a następnie uruchamia plik wykonywalny w ścieżce względnej./x
(to znaczy względem nowego katalogu roboczego).Ta wersja:
próbuje uruchomić plik wykonywalny na ścieżce względnej
./home/path_to_x/x
, co oznacza, niezależnie od tego, jaki jest teraz bieżący katalog roboczy . To wyjaśnia, dlaczego pojawia się błąd - ta ścieżka względna naprawdę nie istnieje.Polecenie, które chcesz, to:
używając ponownie ścieżki bezwzględnej (zaczynając od katalogu głównego
/
).Aha, możesz też po prostu dodać
/home/path_to_x
do swojegoPATH
zamiast tworzyć alias. Zobacz: Jak uruchamiać skrypty bez wpisywania pełnej ścieżki?źródło
pwd
/home/path_to_x/x
nie jest funkcjonalnie równoważny z(cd /home/path_to_x && ./x)
; jeśli to działa, czy nie, zależy od aplikacji.Jeśli nie chcesz,
cd
aby trzymać po podstawieniu aliasu, użyj podpowłoce z(
y)
:możesz to sprawdzić za pomocą
Zauważ, że rozwiązanie
nie jest dokładnie równoważne. W rzeczywistości, jeśli zostanie wywołany przez
my_x
,x
program zostanie uruchomiony z bieżącym katalogiem/home/path_to_x/
, natomiast jeśli zostanie wywołany przezmy_y
,x
zostanie uruchomiony z bieżącym katalogiem, w którymmy_y
wydano polecenie . Może to być ważne lub nie, w zależności od tego, cox
się dzieje.O rozwiązaniu OP działa w
bash
:ale nie w
zsh
:Wygląda na to, że bash i zsh wykonują listy na różne sposoby ... więc lepiej dodać jawny nawias ... dziękuję @EliahKagan za wskazanie go mi.
źródło
&
wyższemu pierwszeństwa, niż się&&
wydaje, może być wyjątkowezsh
. Starałemsleep 5 && echo done &
sięzsh
,bash
,ksh
,mksh
,dash
, i jeszcze jedna powłoka non-Bourne-style (tcsh
).zsh
Oceniane tylkosleep 5
na pierwszym planie; wszyscy pozostali wrócili natychmiast (adone
potem oczywiście wydrukowani pięć sekund później). Z drugiej strony, nawet jeśli jest to całkowicie osobliwośćzsh
, myślę, że dodanie wyraźnego( )
(lub{ ;}
) jest rozsądne, ponieważ przekazuje zamiar innym ludziom (lub sobie, czytając później scenariusz lub historię).Jeśli plik, który chcesz uruchomić, jest już wykonywalny, dlaczego nie dodasz go do zmiennej PATH?
Jeśli plik wykonywalny jest
/home/user/aplication/appX
po prostu wprowadźdo twojego
~/.bashrc
lub~/.profile
Po ponownym uruchomieniu konsoli możesz uruchomić ją po prostu za pomocą
appX
Myślę, że to najczystsze rozwiązanie.
źródło
Umieszczenie
&
na końcu wydaje się załatwić sprawę:źródło
x
jesteś w/home/path_to_x
. Na&
koniec wystarczy wysłać proces w tle.cd
s zadania w tle nie wpływają na rozmówcę (co ma sens - byłoby naprawdę dziwnie, gdyby tak zrobiły). Wynika to z faktu, że wykonywanie asynchroniczne korzysta z podpowłoki . Chociaż byłoby lepiej, gdyby wyjaśnił, dlaczego to działa i co&
działa - i jak czasem działa w tle jest czasami niepożądane - jest to (już) poprawna odpowiedź. ( Wyraźnie tworzenie podpowłoki ze( )
składnią, jak sugerujesz , jest jednak prawdopodobnie lepszym rozwiązaniem przez większość czasu.)zsh
i działa skutecznie,bash
a nie wzsh
... musi być jakaś różnica w sposobie rozwijania aliasów.pushd
wzsh
(mamsetopt autopushd pushdsilent pushdtohome
, i pamięta mój cwd.)Uzyskaj kopię zapasową bieżącego pwd, a po uruchomieniu polecenia cofnij ostatnie pwd.
źródło
test
) przesunęły kursor do następnego wiersza. Nadal możesz robić, co chcesz (w tym nacisnąć klawisz Enter, aby otworzyć nowy monit).pushd
ipopd
rób to, co robi twoja odpowiedź.alias x='pushd /home/path_to_x && ./x && popd'