Führen Sie das Programm von überall aus, ohne das Verzeichnis zu wechseln

9

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?

Der Fischer
quelle
9
setze einen Alias ​​wie alias x='/home/path_to_x/x'. Nicht .vorher verwenden /home. .(Punkt) bezieht sich auf das aktuelle Verzeichnis.
Souravc
2
Muss xwirklich 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?
Adaephon
Eine weitere ähnliche Frage askubuntu.com/questions/427818/…
c0rp

Antworten:

13

NICHT CD, sondern nur auf dem absoluten Pfad ausführen

Diese Version:

cd /home/path_to_x && ./x

Ä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:

./home/path_to_x/x

versucht, die ausführbare Datei unter dem relativen Pfad auszuführen, dh ./home/path_to_x/xrelativ zu Ihrem aktuellen Arbeitsverzeichnis . Das erklärt, warum Sie den Fehler erhalten - dieser relative Pfad existiert wirklich nicht.

Der gewünschte Befehl wäre:

/home/path_to_x/x

Verwenden Sie erneut den absoluten Pfad (beginnend mit dem Stammverzeichnis /).

Oh, und Sie können auch einfach /home/path_to_xzu Ihrem hinzufügen , PATHanstatt den Alias ​​zu erstellen. Siehe: Wie führe ich Skripte aus, ohne den vollständigen Pfad einzugeben?

Nutzlos
quelle
Dies ist die richtige Antwort auf die gestellte Frage.
Bis auf weiteres angehalten.
1
Dies wäre nur dann falsch, wenn das Programm in einem bestimmten Verzeichnis ausgeführt werden müsste, aus dem es stammtpwd
Kaz Wolfe
@Whaaaaaat ist richtig. /home/path_to_x/xist funktional nicht äquivalent zu (cd /home/path_to_x && ./x); ob es funktioniert oder nicht, ist anwendungsabhängig.
Rmano
Obwohl Sie im Allgemeinen Recht haben, hat OP bei dieser speziellen Frage sichtbar versucht, vom absoluten Pfad wegzulaufen (nur mit einem Ein-Zeichen-Fehler). Ich bin jedoch sicher, dass sie klären können, ob das Arbeitsverzeichnis in diesem Fall wichtig ist.
Nutzlos
8

Wenn Sie nicht möchten, dass das cdnach der Alias-Ersetzung bleibt, verwenden Sie eine Unterschale mit (y ):

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

Sie können es mit überprüfen

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

Beachten Sie, dass die Lösung

alias my_y="/home/path_to_x/x" 

ist nicht genau gleichwertig. Wenn my_xdas xProgramm über aufgerufen wird , wird es mit einem aktuellen Verzeichnis ausgeführt /home/path_to_x/. Wenn es von aufgerufen wird my_y, xwird es mit einem aktuellen Verzeichnis ausgeführt, in dem der Befehl my_yausgegeben wurde. Dies kann wichtig sein oder nicht, je nachdem, was xgerade getan wird.

Über die OP-Lösung funktioniert es in 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

aber nicht in 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] % 

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.

Rmano
quelle
1
Dem Trailing eine &höhere Priorität einzuräumen, als &&es für einzigartig zu sein scheint zsh. Ich versuchte , sleep 5 && echo done &in zsh, bash, ksh, mksh, dash, und auch eine nicht-Bourne-Shell - Stil ( tcsh). Nur im Vordergrund zshausgewertet sleep 5; Alle anderen kehrten sofort zurück (dann donenatürlich auch fünf Sekunden später gedruckt ). Auf der anderen Seite zshhalte 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.
Eliah Kagan
4

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/appXnur eingegeben wird

PATH=$PATH:/home/user/application

zu deinem ~/.bashrcoder~/.profile

Nach dem Neustart Ihrer Konsole können Sie sie einfach mit ausführen appX

Ich denke, das ist die sauberste Lösung.

0xAffe
quelle
3

Ein &am Ende zu setzen scheint den Trick zu tun:

alias x = "cd /home/path_to_x && ./x &"
Der Fischer
quelle
2
Bist du sicher? Nach der Ausführung sind xSie in /home/path_to_x. Am &Ende senden Sie einfach den Prozess im Hintergrund.
Rmano
2
@Rmano Das funktioniert tatsächlich. cds 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.)
Eliah Kagan
@EliahKagan du hast recht. Ich habe die Lösung mit überprüft zshund effektiv funktioniert sie in bashund nicht in zsh... muss ein Unterschied darin sein, wie die Aliase erweitert werden.
Rmano
Eine Frage gestellt: unix.stackexchange.com/questions/162286/…
Rmano
@Rmano haben Sie die Einstellungen in Bezug auf pushdin aktiviert zsh(ich habe setopt autopushd pushdsilent pushdtohome, und es erinnert sich an meine cwd.)
Muru
0

Holen Sie sich ein Backup Ihres aktuellen pwd und machen Sie nach dem Ausführen Ihres Befehls Ihr letztes pwd rückgängig.

alias x='dwp=$(pwd) && cd /home/path_to_x && ./x && cd $dwp'
αғsнιη
quelle
Sie haben die Auswirkung des Alias ​​dieses Rmano falsch verstanden. Die Befehlszeile ist nicht blockiert. Es ist nur so, dass die Ausgabe des Alias ​​( 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).
Muru
Ja, ja richtig. @mure: |
αғsнιη
Da Sie doppelte Anführungszeichen verwenden, enthält die Variable das aktuelle Verzeichnis zum Zeitpunkt der Definition des Alias . Verwenden Sie einfache Anführungszeichen, um die Auswertung zu verschieben, bis der Alias ​​erweitert wird. pushdUnd popdtun Sie, was Ihre Antwort bewirkt. alias x='pushd /home/path_to_x && ./x && popd'
Bis auf weiteres angehalten.