我想每次执行cd
时执行一些代码。如果cd
是最后一个命令,我实际上正在测试,但我认为我走在了正确的轨道上。这是我添加到我的bash_profile
update_prompt()
{
if [ 'cd' = $1 ]; then
#DO STUFF
fi
}
PROMPT_COMMAND="update_prompt "$(!:0)"; $PROMPT_COMMAND"
这很接近,但它试图在$ 1中实际执行命令而不是将其视为字符串。有什么想法吗?
答案 0 :(得分:3)
编辑:这是我提出的解决方案。它不是直接基于问题,而是基于@ schwiz在评论中的解释:
update_prompt()
{
LAST=$(history | tail -n 1 | cut -d \ -f 5)
if [ "cd" = "$LAST" ]; then
# DO STUFF
fi
}
PROMPT_COMMAND="update_prompt"
回答原始问题:比较字符串变量时将其放在括号中以避免解释:
update_prompt()
{
if [ 'cd' = "$1" ]; then
# ...
fi
}
您可以选择考虑为cd
定义别名:
alias cd='echo executed && cd'
答案 1 :(得分:1)
这是一种更加冗长的撰写!:0
的方式,它似乎与PROMPT_COMMAND
的效果更好:
PROMPT_COMMAND='update_prompt $(history -p !:0); $PROMPT_COMMAND'.
单引号可防止命令替换发生,直到实际调用PROMPT_COMMAND
为止。从技术上讲,没有历史扩张;您正在使用history
命令将!:0
字符串作为参数进行处理,但这与预期的历史记录扩展具有相同的效果。
答案 2 :(得分:0)
我会编写一个shell函数来包装cd
,而不是使用PROMPT_COMMAND
来检查最后执行的命令:
cd () {
builtin cd "$@"
# CUSTOM CODE HERE
}