zsh提供了一些不错的钩子函数,包括chpwd用于在用户更改目录后运行函数。
# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd  # hi
我试图在bash中模拟它。
限制条件:
- 它必须在交互式和非交互式shell中都可以工作,我认为这意味着它不能依赖于 
$PROMPT_COMMAND - 它无法重新定义
cd,因为我希望它可用于更改目录的任何命令(例如pushd和popd) - 它必须在用户的命令之后运行,因此
trap "my_function" DEBUG不起作用,除非我可以在其中以某种方式说“首先运行$BASH_COMMAND我们被困的设备,然后再执行此操作……”我看到可以避免自动运行$BASH_COMMANDifextdebug启用并且 trap函数返回1,但我不认为我想强制执行extdebug,并且返回1成功(但已修改)的命令似乎是错误的。 
最后一部分-“在用户命令后运行”-是当前让我感到困惑的部分。如果我可以在每个命令之后运行一个函数,则可以让它检查自上次检查以来目录是否已更改。例如:
function check_pwd() {
  # true in a new shell (empty var) or after cd
  if [ "$LAST_CHECKED_DIR" != "$PWD" ]; then
    my_function
  fi
  LAST_CHECKED_DIR=$PWD
}
我是在正确的轨道上,还是有更好的方法?用户更改目录后如何在bash中运行命令?
                  @ jw013此代码旨在进入一个开源项目,在该项目中,维护者已明确列出了不重新定义
                
                  
                    —
                    内森·朗
                    
                  
                
              cd的原则。
                
                  另外-“还有许多其他方法可以更改目录”-我不知道,这是我不希望依赖于明确列出它们的另一个原因。
                
                
                  
                    —
                    内森·朗
                    
                  
                
              
                  为什么要这样做?您的函数可能会制动许多程序(C,Java,..)。在我使用的脚本中,
                
                  
                    —
                    沃尔特A 
                    
                  
                
              MYBIN=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )请不要更改受信任的Unix命令。
                
                  @NathanLong 仅适用于我的操作系统。此处的操作系统似乎无关紧要。操作系统重要吗?在您的问题中,关键是外壳,您似乎特别在询问
                
                  
                    —
                    jw013 2014年
                    
                  
                
              bash,它在所运行的所有操作系统上的工作原理几乎相同。
                
cd,pushd和popd?有几种其他方法可以更改目录?