1

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

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

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

这很接近,但它会尝试实际执行 $1 中的命令,而不是将其视为字符串。有任何想法吗?

4

3 回答 3

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'
于 2013-03-11T15:09:21.693 回答
1

这是一种更冗长的写作方式!:0,似乎可以更好地使用PROMPT_COMMAND

PROMPT_COMMAND='update_prompt $(history -p !:0); $PROMPT_COMMAND'.

单引号防止命令替换发生,直到PROMPT_COMMAND实际调用。从技术上讲,没有发生历史扩展;您正在使用该history命令将!:0字符串作为参数进行处理,但这确实与预期的历史扩展具有相同的效果。

于 2013-03-11T15:21:53.890 回答
0

我会编写一个 wraps 的 shell 函数cd,而不是PROMPT_COMMAND用来检查最后执行的命令:

cd () {
    builtin cd "$@"
    # CUSTOM CODE HERE
}
于 2013-03-11T16:08:12.577 回答