Alias ​​für CD in einem Verzeichnis und Aufruf eines Befehls

Alias ​​für CD in einem Verzeichnis und Aufruf eines Befehls

Ich habe ein .bash_profileund 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.

  1. CD in ein Verzeichnis
  2. 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.shdas sich im Verzeichnis befindet $HOME/somedir, $HOME/somedirwobei 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. commandist 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.shin $HOME/somedirmit 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 PATHUmgebungsvariable hinzuzufügen, z. B.

PATH="$PATH:$HOME/somedir"

Jetzt kann script.shes 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_profileDatei 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 cdwerden selten verwendet.)

Antwort4

Trennen Sie Befehle mit einem Semikolon, zB:

alias do_something='cd /tmp; ls'

verwandte Informationen