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 "$@" )
.{ ... }
für die Konsistenz mit längeren Funktionen.pushd
undpopd
(auch> /dev/null
wenn Sie versuchen, die ausgegebenen Nachrichten ebenfalls zu vermeiden), während Sie gleichzeitig den Kontext sauber halten!(cd dir && thing)
ist auch viel portabler als die Verwendung vonpushd
undpopd
.Wenn Sie also das Verzeichnis (cd) in den Ordner ändern
/var/log/
und dann dessen Dateien auflisten möchten, können Sie.bash_profile
Folgendes in Ihre Datei einfügen :quelle
Ich benutze diese Funktion, um einen einzelnen Befehl in einem anderen Verzeichnis auszuführen:
Eine Einschränkung dieser Funktion besteht darin, dass Platzhalter relativ zum ursprünglichen Verzeichnis und nicht relativ zum Verzeichnis, in dem der Befehl ausgeführt wird, angegeben werden. In zsh kann man es besser machen .
Diese Funktion verhält sich wie gewohnt
cd
wenn sie mit einem einzelnen Argument aufgerufen wirdcd
. Sie können sie also aufrufen . (Diese Funktion unterstützt keine Optionen, aber Optionen,cd
die nur selten verwendet werden.)quelle
Kommandos durch Semikolon trennen, zB:
quelle
cd
fehlschlägt, würden Sie die Verzeichnisliste des falschen Verzeichnisses erhalten. Es ist besser,&&
anstatt;
hier zu verwenden.