it-swarm.com.de

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

Ich möchte einen Alias ​​erstellen, der das 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 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
TheFisherman

NICHT CD, sondern nur mit dem absoluten Pfad

Diese Version:

_cd /home/path_to_x && ./x
_

ändert das Verzeichnis in einen absoluten Pfad (Sie sehen, wie _/home/..._ im Stammverzeichnis beginnt) und führt dann die ausführbare Datei im relativen Pfad _./x_ (dh relativ zum neuen Arbeitsverzeichnis).

Diese Version:

_./home/path_to_x/x
_

versucht, die ausführbare Datei unter dem relativen Pfad _./home/path_to_x/x_ auszuführen, dh relativ zu , unabhängig von Ihrer aktuellen Arbeitsweise Verzeichnis ist jetzt . 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_x_ zu Ihrem PATH hinzufügen, anstatt den Alias ​​zu erstellen. Siehe: Wie führe ich Skripte aus, ohne den vollständigen Pfad einzugeben?

13
Useless

Wenn Sie nicht möchten, dass cd nach dem Ersetzen des Alias ​​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. Tatsächlich wird bei einem Aufruf über _my_x_ das Programm x mit einem aktuellen Verzeichnis _/home/path_to_x/_ ausgeführt, während bei einem Aufruf über _my_y_ x mit einem ausgeführt wird aktuelles Verzeichnis, in dem der Befehl _my_y_ ausgegeben wurde. Dies kann wichtig sein oder nicht, je nachdem, was x tut.

Über die OP-Lösung , funktioniert es in bash:

_[email protected]:~$ pwd
/home/romano
[email protected]:~$ alias x="cd /bin && ./echo A >/dev/null  &"
[email protected]:~$ x
[1] 16611
[email protected]:~$ 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 verschiedene Arten ausführen ... also ist es besser, die explizite Klammer hinzuzufügen ... danke @EliahKagan, dass Sie mir darauf hingewiesen haben.

8
Rmano

Wenn die Datei, die Sie ausführen möchten, bereits ausführbar ist, fügen Sie sie dann Ihrer PATH-Variablen hinzu.

Wenn Ihre ausführbare Datei /home/user/aplication/appX ist, geben Sie einfach ein

PATH=$PATH:/home/user/application

zu deinem ~/.bashrc oder ~/.profile

Nachdem Sie Ihre Konsole neu gestartet haben, können Sie sie einfach mit appX ausführen.

Ich denke, das ist die sauberste Lösung.

3
0xAffe

Das Setzen eines & am Ende scheint den Trick zu tun:

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

Holen Sie sich ein Backup Ihrer aktuellen pwd und machen Sie Ihre letzte pwd rückgängig, nachdem Sie Ihren Befehl ausgeführt haben.

alias x='dwp=$(pwd) && cd /home/path_to_x && ./x && cd $dwp'
0
αғsнιη