我试图在我运行的服务器上设置一些东西,当我cd
进入一个public_html
文件夹时,95%的时间我总是会运行一些命令来检查某些东西。
无论如何,我是否可以挂钩,cd
以便如果目录是 a public_html
,它会自动为我运行命令?
如果我无法连接到该cd
命令,我还可以做其他事情来实现我想要的结果吗?
我运行的是 CentOS 5.8。
答案1
与ksh
或bash
(或zsh
):
cd() {
builtin cd "$@" || return
[ "$OLDPWD" = "$PWD" ] || case $PWD in
(*/public_html) echo do something
esac
}
和zsh
:
chpwd()
case $PWD in
(*/public_html) echo do something
esac
(chpwd
是一个钩每当当前工作目录更改时调用的函数(通过cd
, pushd
, popd
...))。
答案2
您可以将此函数添加到您的.bashrc
或其他启动文件中(取决于您的 shell)。
cd() {
if [ "$1" = "public_html" ]; then
echo "current dir is my dir"
fi
builtin cd "$1"
}
答案3
cd
不建议使用现有命令Wrapping 。
更通用的解决方案是chpwd
在 Bash 中定义自定义挂钩。 (根据这个问题的标签,我假设你正在使用Bash)
与其他现代 shell 相比,Bash 没有设计完整的钩子系统。PROMPT_COMMAND
变量作为钩子函数使用,相当于precmd
ZSH中的钩子,fish_prompt
Fish中。目前,ZSH 是我所知道的唯一具有chpwd
内置钩子的 shell。
提示命令
如果设置,该值将被解释为在打印每个主提示 ($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}"
由于我们PWD
直接检测变化,因此该解决方案适用于cd
、pushd
和popd
。
笔记chpwd
:我们在 Bash 中的实现与ZSH 中的实现之间的主要区别chpwd
是,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"
来源:在 Bash 中创建 chpwd 等效 Hook从我的要点来看。
对于任何想要 ZSH 答案的人。chpwd
在ZSH中使用钩子。不要chpwd()
直接定义函数。 更多详细信息请参见此处。
答案4
在 bash 中使用强大的 zsh 方法:
首先是扩展 bash 的简单方法:
〜/.runscripts
#load all scripts inside $1 dir
run_scripts()
{
for script in $1/*; do
# skip non-executable snippets
[ -f "$script" ] && [ -x "$script" ] || continue
# execute $script in the context of the current shell
. $script
done
}
包含在 .bashrc 中:
. ~/.run_scripts
run_scripts ~/.bashrc.d
您可以使用以下命令创建 ~/.bashrc.d/cdhook:
#!/bin/bash
chpwd() {
: #no action
}
cd() {
builtin cd $1
chpwd $1
}
现在由您来替换该函数:
#list files after cd
chpwd() {
ls -lah --color
}