Is there a hook in Bash to find out when the cwd changes?

前端 未结 2 1032
不思量自难忘°
不思量自难忘° 2021-02-01 07:19

I am usually using zsh, which provides the chpwd() hook. That is: If the cwd is changed by the cd builtin, zsh automatically calls the method chpwd() if it exists. This allows t

相关标签:
2条回答
  • 2021-02-01 07:27

    A better solution could be defining a custom chpwd hook.

    There's not a complete hook system designed in Bash when compared with other modern shells. PROMPT_COMMAND variable is used as a hook function, which is equivalent to precmd hook in ZSH, fish_prompt in Fish. For the time being, ZSH is the only shell I've known that has a chpwd hook builtin.

    PROMPT_COMMAND

    If set, the value is interpreted as a command to execute before the printing of each primary prompt ($PS1).

    https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Bash-Variables

    chpwd Hook in Bash

    A trick is provided to setup a chpwd equivalent hook in Bash based on 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}"
    

    Usage

    # example 1: `ls` list directory once dir is changed
    _ls_on_cwd_change() {
      ls
    }
    
    # append the command into CHPWD_COMMAND
    CHPWD_COMMAND="${CHPWD_COMMAND:+$CHPWD_COMMAND;}_ls_on_cwd_change"
    
    # or just use `ls` directly
    CHPWD_COMMAND="${CHPWD_COMMAND:+$CHPWD_COMMAND;}ls"
    

    Source: Create chpwd Equivalent Hook in Bash from my gist.

    0 讨论(0)
  • 2021-02-01 07:35

    You would have to use a DEBUG trap or PROMPT_COMMAND.

    Examples:

    trap chpwd DEBUG        # calls the function before each command
    
    PROMPT_COMMAND=chpwd    # calls the function after each command
    

    Note that the function defined in PROMPT_COMMAND is run before each prompt, though, even empty ones.

    0 讨论(0)
提交回复
热议问题