Wrapping cd
, ein vorhandener Befehl, wird nicht empfohlen.
Eine universellere Lösung wäre das Definieren eines benutzerdefinierten chpwd
Hooks in Bash. (Laut Tags dieser Frage gehe ich davon aus, dass Sie Bash verwenden.)
Im Vergleich zu anderen modernen Schalen gibt es in Bash kein komplettes Hakensystem. PROMPT_COMMAND
Die Variable wird als Hook-Funktion verwendet, die dem precmd
Hook in ZSH fish_prompt
in Fish entspricht. Derzeit ist ZSH die einzige mir bekannte Shell, in die ein chpwd
Haken eingebaut ist.
PROMPT_COMMAND
Wenn festgelegt, wird der Wert als Befehl interpretiert, der vor dem Drucken jeder primären Eingabeaufforderung ($ PS1) ausgeführt werden soll.
https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Bash-Variables
chpwd
Haken Sie Bash ein
Es wird ein Trick bereitgestellt, um einen chpwd
äquivalenten Hook in Bash basierend auf einzurichten PROMPT_COMMAND
.
# create a PROPMT_COMMAND equivalent to store chpwd functions
typeset -g CHPWD_COMMAND=""
_chpwd_hook() {
shopt -s nullglob
local f
# run commands in CHPWD_COMMAND variable on dir change
if [[ "$PREVPWD" != "$PWD" ]]; then
local IFS=$';'
for f in $CHPWD_COMMAND; do
"$f"
done
unset IFS
fi
# refresh last working dir record
export PREVPWD="$PWD"
}
# add `;` after _chpwd_hook if PROMPT_COMMAND is not empty
PROMPT_COMMAND="_chpwd_hook${PROMPT_COMMAND:+;$PROMPT_COMMAND}"
Da wir Erfassung PWD
direkt ändern, funktioniert die Lösung mit cd
, pushd
und popd
.
Hinweis : Der Hauptunterschied zwischen unserer chpwd
Implementierung in Bash und der chpwd
in ZSH besteht darin, dass PROMPT_COMMAND
sie in einer nicht interaktiven Bash-Shell nicht unterstützt wird.
Verwendungszweck
_public_html_action() {
if [[ $PWD == */public_html ]]; then
# actions
fi
}
# append the command into CHPWD_COMMAND
CHPWD_COMMAND="${CHPWD_COMMAND:+$CHPWD_COMMAND;}_public_html_action"
Quelle: Erstellen Sie chpwd Equivalent Hook in Bash aus meinem Kern.
Für alle, die eine Antwort für ZSH wollen. Verwenden Sie den chpwd
Haken in ZSH. Funktion nicht direkt definieren chpwd()
. Mehr Details hier .
echo "Testing..."
Ausgabe direkt über der if-, aber nothings-Ausgabe hinzugefügt. Muss ich etwas tun, um diese Änderungen anzuwenden?