检查上一个命令

时间:2013-03-11 15:07:03

标签: bash .bash-profile

我想每次执行cd时执行一些代码。如果cd是最后一个命令,我实际上正在测试,但我认为我走在了正确的轨道上。这是我添加到我的bash_profile

的内容
update_prompt()
{
   if [ 'cd' = $1 ]; then
     #DO STUFF
   fi
}

PROMPT_COMMAND="update_prompt "$(!:0)"; $PROMPT_COMMAND"

这很接近,但它试图在$ 1中实际执行命令而不是将其视为字符串。有什么想法吗?

3 个答案:

答案 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
}