Wrapping cd, ein vorhandener Befehl, wird nicht empfohlen.
Eine universellere Lösung wäre das Definieren eines benutzerdefinierten chpwdHooks 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_COMMANDDie Variable wird als Hook-Funktion verwendet, die dem precmdHook in ZSH fish_promptin Fish entspricht. Derzeit ist ZSH die einzige mir bekannte Shell, in die ein chpwdHaken 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 PWDdirekt ändern, funktioniert die Lösung mit cd, pushdund popd.
Hinweis : Der Hauptunterschied zwischen unserer chpwdImplementierung in Bash und der chpwdin ZSH besteht darin, dass PROMPT_COMMANDsie 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 chpwdHaken 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?