18

私は通常、chpwd()フックを提供するzshを使用しています。つまり、cdビルトインによってcwdが変更された場合、zshはメソッドchpwd()が存在する場合はそれを自動的に呼び出します。これにより、cwdに依存する変数とエイリアスを設定できます。

ここで、.zshrcのこのビットをbashに移植したいのですが、chpwd()がbashによって認識されないことがわかりました。同様の機能がbashにすでに存在しますか?CDの再定義が機能することは承知していますが(以下を参照)、よりエレガントなソリューションを目指しています。

function cd()
{
    builtin cd $@
    chpwd
}
4

2 に答える 2

14

DEBUGtrapまたはを使用する必要がありPROMPT_COMMANDます。

例:

trap chpwd DEBUG        # calls the function before each command

PROMPT_COMMAND=chpwd    # calls the function after each command

ただし、で定義された関数は、空のプロンプトであっても、プロンプトのPROMPT_COMMAND前に実行されることに注意してください。

于 2010-07-18T16:20:32.173 に答える
2

より良い解決策は、カスタムchpwdフックを定義することです。

他の最新のシェルと比較した場合、Bashで設計された完全なフックシステムはありません。変数は、FishのZSHのフックにPROMPT_COMMAND相当するフック関数として使用されます。とりあえず、フックが組み込まれているのはZSHだけです。precmdfish_promptchpwd

PROMPT_COMMAND

設定されている場合、値は各プライマリプロンプト($ PS1)を出力する前に実行するコマンドとして解釈されます。

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

chpwdBashにフックする

chpwdに基づいてBashで同等のフックを設定するためのトリックが提供されています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}"

使用法

# 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"

出典:私の要点からBashでchpwd相当のフックを作成します

于 2019-07-20T03:19:10.270 に答える