zsh bietet einige nette Hook-Funktionen , einschließlich chpwd
zum Ausführen einer Funktion, nachdem der Benutzer die Verzeichnisse gewechselt hat.
# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd # hi
Ich versuche das in Bash zu emulieren.
Einschränkungen:
- Es muss sowohl in interaktiven als auch in nicht interaktiven Shells funktionieren, was meiner Meinung nach bedeutet, dass es sich nicht auf so etwas verlassen kann
$PROMPT_COMMAND
- Es kann nicht neu definiert werden
cd
, da ich möchte, dass es für jeden Befehl funktioniert, der Verzeichnisse ändert (z. B.pushd
undpopd
). - Es muss nach dem Befehl des Benutzers ausgeführt werden,
trap "my_function" DEBUG
funktioniert also nicht, es sei denn, ich kann dort irgendwie sagen: "Führen Sie zuerst das, was$BASH_COMMAND
wir gefangen haben, dann auch dies aus ..." Ich sehe, dass ich das automatische Ausführen von$BASH_COMMAND
if vermeiden kann, wennextdebug
es aktiviert ist und die Trap-Funktion gibt 1 zurück, aber ich glaube nicht, dass ich erzwingen möchteextdebug
, und die Rückkehr1
für einen erfolgreichen (aber geänderten) Befehl scheint falsch.
Der letzte Teil - "Nach dem Befehl des Benutzers ausführen" - hat mich derzeit verblüfft. Wenn ich nach jedem Befehl eine Funktion ausführen kann , kann ich überprüfen lassen, ob sich das Verzeichnis seit unserer letzten Überprüfung geändert hat. Z.B:
function check_pwd() {
# true in a new shell (empty var) or after cd
if [ "$LAST_CHECKED_DIR" != "$PWD" ]; then
my_function
fi
LAST_CHECKED_DIR=$PWD
}
Bin ich auf dem richtigen Weg oder gibt es einen besseren Weg? Wie kann ich einen Befehl in bash ausführen, nachdem der Benutzer die Verzeichnisse geändert hat?
cd
grundsätzlich neu definiert.
MYBIN=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
, ändern Sie bitte nicht die vertrauenswürdigen Unix-Befehle.
bash
, was auf allen Betriebssystemen, auf denen es ausgeführt wird, ziemlich gleich funktioniert.
cd
,pushd
undpopd
? Wie viele andere Möglichkeiten gibt es, das Verzeichnis zu wechseln?