TMH*_*TMH 11 shell bash cd-command
我正在尝试在我运行的服务器上设置一些东西,每当我cd进入public_html文件夹时,95% 的时间我都会运行一些命令来检查某些事情。
无论如何我可以挂钩,cd所以如果目录是 a public_html,它会自动为我运行命令吗?
如果我无法进入cd命令,我还能做其他事情来实现我所追求的结果吗?
我正在运行 CentOS 5.8。
Sté*_*las 17
与ksh或bash(或zsh):
cd() {
builtin cd "$@" || return
[ "$OLDPWD" = "$PWD" ] || case $PWD in
(*/public_html) echo do something
esac
}
Run Code Online (Sandbox Code Playgroud)
与zsh:
chpwd()
case $PWD in
(*/public_html) echo do something
esac
Run Code Online (Sandbox Code Playgroud)
(chpwd是一个钩子函数,每当当前工作目录发生变化时就会调用它(通过cd, pushd, popd...))。
UVV*_*UVV 15
您可以将此功能添加到您的.bashrc或其他启动文件(取决于您的外壳)。
cd() {
if [ "$1" = "public_html" ]; then
echo "current dir is my dir"
fi
builtin cd "$1"
}
Run Code Online (Sandbox Code Playgroud)
cd不建议使用现有命令Wrapping 。
更通用的解决方案是chpwd在 Bash 中定义自定义钩子。(根据这个问题的标签,我假设你正在使用 Bash)
与其他现代 shell 相比,Bash 没有设计完整的钩子系统。PROMPT_COMMAND变量用作钩子函数,相当于precmdZSH中的hook,fish_prompt在Fish中。目前,ZSH 是我所知道的唯一一个chpwd内置钩子的 shell。
PROMPT_COMMAND
如果设置,该值将被解释为在打印每个主要提示 ($PS1) 之前执行的命令。
https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Bash-Variables
chpwd 在 Bash 中挂钩提供了一个技巧来chpwd在 Bash 中基于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}"
Run Code Online (Sandbox Code Playgroud)
由于我们检测PWD直接更改,该解决方案可与cd,pushd和popd。
注意:我们chpwd在 Bash 和chpwdZSH 中的实现之间的主要区别是,PROMPT_COMMAND在非交互式 Bash shell 中不受支持。
_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"
Run Code Online (Sandbox Code Playgroud)
来源:根据我的要点在 Bash 中创建 chpwd 等效钩子。
对于任何想要 ZSH 答案的人。chpwd在 ZSH 中使用钩子。不要chpwd()直接定义函数。 更多细节在这里。