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?


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?


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.


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.


3

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

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

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


@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'

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.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.