Ich möchte einen Alias erstellen, der Programm x ausführt, ohne das aktuelle Verzeichnis zu ändern, in dem ich mich befinde. Was ich jetzt habe, ist:
alias x = "cd /home/path_to_x && ./x"
Dies funktioniert, ändert aber mein Verzeichnis. Was ich tun möchte, ist so etwas wie:
alias x="./home/path_to_x/x
Aber dann bekomme ich keine solche Datei oder Verzeichnis. Kennt jemand eine Problemumgehung dafür?
command-line
alias
Der Fischer
quelle
quelle
alias x='/home/path_to_x/x'
. Nicht.
vorher verwenden/home
..
(Punkt) bezieht sich auf das aktuelle Verzeichnis.x
wirklich ausgeführt werden, während Sie in sind/home/path_to_x
? Oder sind Sie sich nicht sicher, wie Sie ein Programm ausführen sollen, das sich in einem bestimmten Verzeichnis befindet?Antworten:
NICHT CD, sondern nur auf dem absoluten Pfad ausführen
Diese Version:
Ändert das Verzeichnis in einen absoluten Pfad (Sie sehen, wie es
/home/...
im Stammverzeichnis beginnt) und führt dann die ausführbare Datei im relativen Pfad aus./x
(dh relativ zum neuen Arbeitsverzeichnis).Diese Version:
versucht, die ausführbare Datei unter dem relativen Pfad auszuführen, dh
./home/path_to_x/x
relativ zu Ihrem aktuellen Arbeitsverzeichnis . Das erklärt, warum Sie den Fehler erhalten - dieser relative Pfad existiert wirklich nicht.Der gewünschte Befehl wäre:
Verwenden Sie erneut den absoluten Pfad (beginnend mit dem Stammverzeichnis
/
).Oh, und Sie können auch einfach
/home/path_to_x
zu Ihrem hinzufügen ,PATH
anstatt den Alias zu erstellen. Siehe: Wie führe ich Skripte aus, ohne den vollständigen Pfad einzugeben?quelle
pwd
/home/path_to_x/x
ist funktional nicht äquivalent zu(cd /home/path_to_x && ./x)
; ob es funktioniert oder nicht, ist anwendungsabhängig.Wenn Sie nicht möchten, dass das
cd
nach der Alias-Ersetzung bleibt, verwenden Sie eine Unterschale mit(
y)
:Sie können es mit überprüfen
Beachten Sie, dass die Lösung
ist nicht genau gleichwertig. Wenn
my_x
dasx
Programm über aufgerufen wird , wird es mit einem aktuellen Verzeichnis ausgeführt/home/path_to_x/
. Wenn es von aufgerufen wirdmy_y
,x
wird es mit einem aktuellen Verzeichnis ausgeführt, in dem der Befehlmy_y
ausgegeben wurde. Dies kann wichtig sein oder nicht, je nachdem, wasx
gerade getan wird.Über die OP-Lösung funktioniert es in
bash
:aber nicht in
zsh
:Es scheint, dass bash und zsh Listen auf unterschiedliche Weise ausführen ... daher ist es besser, die explizite Klammer hinzuzufügen ... danke @EliahKagan, dass Sie darauf hingewiesen haben.
quelle
&
höhere Priorität einzuräumen, als&&
es für einzigartig zu sein scheintzsh
. Ich versuchte ,sleep 5 && echo done &
inzsh
,bash
,ksh
,mksh
,dash
, und auch eine nicht-Bourne-Shell - Stil (tcsh
). Nur im Vordergrundzsh
ausgewertetsleep 5
; Alle anderen kehrten sofort zurück (danndone
natürlich auch fünf Sekunden später gedruckt ). Auf der anderen Seitezsh
halte ich das Hinzufügen von explizit( )
(oder{ ;}
) für sinnvoll , auch wenn dies eine Besonderheit von ist, da es die Absicht anderen Menschen (oder sich selbst beim späteren Lesen des Drehbuchs oder der Geschichte) vermittelt.Wenn die Datei, die Sie ausführen möchten, bereits ausführbar ist, warum fügen Sie sie nicht Ihrer PATH-Variablen hinzu?
Wenn Ihre ausführbare Datei
/home/user/aplication/appX
nur eingegeben wirdzu deinem
~/.bashrc
oder~/.profile
Nach dem Neustart Ihrer Konsole können Sie sie einfach mit ausführen
appX
Ich denke, das ist die sauberste Lösung.
quelle
Ein
&
am Ende zu setzen scheint den Trick zu tun:quelle
x
Sie in/home/path_to_x
. Am&
Ende senden Sie einfach den Prozess im Hintergrund.cd
s in Hintergrundjobs wirken sich nicht auf den Anrufer aus (was Sinn macht - es wäre wirklich seltsam, wenn sie dies tun würden). Dies liegt daran, dass bei der asynchronen Ausführung eine Unterschale verwendet wird . Obwohl dies besser wäre, wenn erklärt würde, warum es funktioniert und was es&
tut - und wie das Laufen im Hintergrund manchmal unerwünscht ist -, ist dies (bereits) eine richtige Antwort. (Eine explizite Erstellung einer Subshell mit( )
Syntax ist, wie Sie vorschlagen , wahrscheinlich die meiste Zeit eine bessere Lösung.)zsh
und effektiv funktioniert sie inbash
und nicht inzsh
... muss ein Unterschied darin sein, wie die Aliase erweitert werden.pushd
in aktiviertzsh
(ich habesetopt autopushd pushdsilent pushdtohome
, und es erinnert sich an meine cwd.)Holen Sie sich ein Backup Ihres aktuellen pwd und machen Sie nach dem Ausführen Ihres Befehls Ihr letztes pwd rückgängig.
quelle
test
) den Cursor in die nächste Zeile bewegt hat. Sie können dort immer noch tun, was Sie wollen (einschließlich der Eingabetaste, um eine neue Eingabeaufforderung zu öffnen).pushd
Undpopd
tun Sie, was Ihre Antwort bewirkt.alias x='pushd /home/path_to_x && ./x && popd'