Um einen Befehl mit einem bestimmten Arbeitsverzeichnis auszuführen, ist dies normalerweise der Fall
( cd directory && utility )
Die Klammern um cd ...
bedeuten, dass die darin enthaltenen Befehle in einer Subshell ausgeführt werden. Das Ändern des Arbeitsverzeichnisses in einer Subshell bewirkt, dass das aktuelle Arbeitsverzeichnis der aufrufenden Shell nicht geändert wird, dh nach dem Aufrufen dieses Befehls befinden Sie sich immer noch in dem Verzeichnis, in dem Sie gestartet haben.
Beispiel:
( cd / && echo "$PWD" ) # will output "/"
echo "$PWD" # will output whatever directory you were in at the start
Dies kann nicht in einen generischen Alias umgewandelt werden, da ein Alias keine Argumente annehmen kann.
Für ein bestimmtes Verzeichnis und Dienstprogramm könnte man das tun
alias cdrun='( cd "$HOME/somedir" && ./script.sh )'
aber für den allgemeinen Fall müssten Sie eine Shell-Funktion verwenden:
cdrun () {
( cd "$1" && shift && command "$@" )
}
oder
cdrun () (
cd "$1" && shift && command "$@"
)
Durch Ersetzen der geschweiften Klammern durch Klammern um den Funktionskörper wird die Funktion in einer eigenen Subshell ausgeführt.
Dies würde als verwendet werden
$ cdrun "$HOME/somedir" ./script.sh
welches das script.sh
im Verzeichnis befindliche Skript $HOME/somedir
mit $HOME/somedir
als Arbeitsverzeichnis ausführen würde , oder
$ cdrun / ls -l
Dies würde Ihnen eine Verzeichnisliste im "langen Format" des Stammverzeichnisses liefern.
Die Shell-Funktion verwendet ihr erstes Argument und versucht, in dieses Verzeichnis zu wechseln. Wenn das funktioniert, verschiebt es den Verzeichnisnamen von den Positionsparametern (der Befehlszeilenargumentliste) weg und führt den Befehl aus, der von den restlichen Argumenten gegeben wird. command
ist ein in die Shell integrierter Befehl, der seine Argumente einfach als Befehl ausführt.
All dies ist erforderlich, wenn Sie einen Befehl mit einem geänderten Arbeitsverzeichnis ausführen möchten . Wenn Sie nur einen Befehl ausführen möchten, der sich an einer anderen Stelle befindet, können Sie natürlich verwenden
alias thing='$HOME/somedir/script.sh'
aber dies würde script.sh
sich in $HOME/somedir
dem aktuellen Verzeichnis als Arbeitsverzeichnis.
Eine andere Möglichkeit, ein Skript auszuführen, das sich an einer anderen Stelle befindet, ohne das Arbeitsverzeichnis zu ändern, besteht darin, der PATH
Umgebungsvariablen den Speicherort des Skripts hinzuzufügen , z
PATH="$PATH:$HOME/somedir"
Jetzt kann script.sh
in $HOME/somedir
von überall mit ausgeführt werden
$ script.sh
Auch hierdurch wird das Arbeitsverzeichnis für den Befehl nicht geändert.
cdrun () ( cd "$1" && shift && command "$@" )
.