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

最後に実行されたコマンドをチェックするためにcd使用するのではなく、ラップするシェル関数を記述します。PROMPT_COMMAND

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