
Ich habe ein .bash_profile
und darin habe ich eine Reihe von Aliasen. Diese Aliase führen im Moment nur einen einzigen Befehl aus und es war ziemlich einfach. Ich möchte jedoch zwei Dinge mit einem neuen Alias tun, den ich zu erstellen versuche.
- CD in ein Verzeichnis
- Führen Sie einen Befehl aus diesem Verzeichnis aus
Antwort1
Um einen Befehl mit einem bestimmten Arbeitsverzeichnis auszuführen, macht man normalerweise
( cd directory && utility )
Die Klammern um das 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, d. h., nach dem Aufruf dieses Befehls befinden Sie sich immer noch im selben Verzeichnis, in dem Sie gestartet sind.
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 einSpezifischVerzeichnis und Dienstprogramm, könnte man tun
alias cdrun='( cd "$HOME/somedir" && ./script.sh )'
aber im allgemeinen Fall müssten Sie eine Shell-Funktion verwenden:
cdrun () {
( cd "$1" && shift && command "$@" )
}
oder
cdrun () (
cd "$1" && shift && command "$@"
)
Wenn Sie die geschweiften Klammern um den Hauptteil der Funktion durch Klammern ersetzen, wird die Funktion in ihrer eigenen Untershell ausgeführt.
Dies würde verwendet werden als
$ cdrun "$HOME/somedir" ./script.sh
Dadurch wird das Skript ausgeführt, script.sh
das sich im Verzeichnis befindet $HOME/somedir
, $HOME/somedir
wobei das Arbeitsverzeichnis das ist, oder
$ cdrun / ls -l
Dadurch erhalten Sie eine Verzeichnisliste des Stammverzeichnisses im „Langformat“.
Die Shell-Funktion nimmt ihr erstes Argument und versucht, in dieses Verzeichnis zu wechseln. Wenn das funktioniert, verschiebt sie den Verzeichnisnamen aus den Positionsparametern (der Befehlszeilenargumentliste) und führt den Befehl aus, der durch die restlichen Argumente gegeben ist. command
ist ein in der Shell integrierter Befehl, der seine Argumente einfach als Befehl ausführt.
All dies ist erforderlich, wenn Sie einen Befehl ausführen möchtenmit geändertem ArbeitsverzeichnisWenn Sie nur einen Befehl ausführen möchten, der sich woanders befindet, können Sie natürlich verwenden
alias thing='$HOME/somedir/script.sh'
aber dies würde laufen script.sh
in $HOME/somedir
mit deraktuellVerzeichnis als Arbeitsverzeichnis.
Eine weitere Möglichkeit, ein Skript auszuführen, das sich an einem anderen Ort befindet, ohne das Arbeitsverzeichnis zu ändern, besteht darin, den Speicherort des Skripts zu Ihrer PATH
Umgebungsvariable hinzuzufügen, z. B.
PATH="$PATH:$HOME/somedir"
Jetzt kann script.sh
es von überall aus ausgeführt werden, indem Sie einfach$HOME/somedir
$ script.sh
Auch diesnichtÄndern Sie das Arbeitsverzeichnis für den Befehl.
Antwort2
alias <name-of-the-alias>='cd <the-directory> && <command>'
Wenn Sie also das Verzeichnis (cd) in den Ordner wechseln /var/log/
und dann dessen Dateien auflisten (ls) möchten, können Sie Ihrer .bash_profile
Datei Folgendes anhängen:
alias logs='cd /var/log/ && ls'
Antwort3
Ich verwende diese Funktion, um einen einzelnen Befehl in einem anderen Verzeichnis auszuführen:
cd1 () {
if [ $# -eq 1 ]; then
command cd -- "$1"
else
( command cd -- "$1" && shift && "$@" )
fi
}
Eine Einschränkung dieser Funktion besteht darin, dass Platzhalter relativ zum ursprünglichen Verzeichnis vervollständigt werden und nicht relativ zum Verzeichnis, in dem der Befehl ausgeführt wird.In zsh ist es möglich, es besser zu machen.
Diese Funktion verhält sich wie die normale Funktion cd
, wenn sie mit einem einzigen Argument aufgerufen wird. Sie können sie also aufrufen cd
. (Diese Funktion unterstützt keine Optionen, aber Optionen cd
werden selten verwendet.)
Antwort4
Trennen Sie Befehle mit einem Semikolon, zB:
alias do_something='cd /tmp; ls'