bash 履歴に現在のディレクトリを含めるユーティリティまたはプラグインはありますか?

bash 履歴に現在のディレクトリを含めるユーティリティまたはプラグインはありますか?

bash の履歴に、コマンドが実行された作業ディレクトリを表示すると非常に便利です。履歴は、何をしたかを確認するのに便利ですが、どこで実行したかを把握するのは難しい場合があります。

そのようなプラグインやユーティリティはありますか、それともそれを追加するように bash を設定できますか?

答え1

あなたはPROMPT_COMMAND.profile機能、 /に追加.bashrc:

myprompt() {  
  [[ "$PWD" != "$PREVPWD" ]] && history -s "# cd \"$PWD\""
  PREVPWD="$PWD" 
}  
PROMPT_COMMAND=myprompt

cdこれは、現在のディレクトリが変更されるたびに、(コメント アウトされた)コマンドを履歴に書き込みます。 を保存する$PWDので、 のようなものはcd ..完全なパスを記録します。 これは通常の履歴に表示されるため、あまり便利ではなく、次のような省略形が壊れます!$...

以下はより良い(つまり、過剰に設計された)バージョンです。履歴の汚染を防ぐために、前のコマンドがディレクトリを絶対ディレクトリに変更したかどうかを確認します。

myprompt() {
  local _seq _date _time _cmd _args
  [[ -z "$HISTTIMEFORMAT" ]] && { 
    ## reads history with no HISTTIMEFORMAT set
    read _seq _cmd _args < <(history 1)
  } || {
    ## this reads history with a HISTTIMEFORMAT='%Y%m%d %H:%M:%S '
    read _seq _date _time _cmd _args < <(history 1)
  }
  ## escaping =~ is troublesome, use variables instead
  local _re1='(cd|pushd|popd)'
  local _re2='^"?/'
  ## check for change-of-directory with absolute path
  [[ "$_cmd" =~ $_re1 && "$_args" =~ $_re2 ]] && {
    PREVPWD="$PWD"
    return
  }
  [[ "$PWD" != "$PREVPWD" ]] && {
     history -s "# cd \"$PWD\""    # stuff into history
     PREVPWD="$PWD"
  }
} 
PROMPT_COMMAND=myprompt

カスタムの場合は、若干の調整が必要になる場合がありますHISTTIMEFORMAT

操作を微調整して、代わりに、、コマンドhistory -sを削除して再挿入/変更することもcdできます。例:pushdpopd

  [[ "$_cmd" =~ $_re1 ]] && {
    history -d $_seq  # remove original user command
    history -s "$_cmd $_args # $_cmd \"$PWD\"" # add annotated version
  }

HISTTIMEFORMAT(関数内で動的に変更するという選択肢もありますPROMPT_COMMANDが、これは履歴ファイルには追加されず、履歴を表示するときにのみ適用されるため、期待どおりには機能しません。)

#nnnnBash は、各コマンド エントリの上に (エポック秒) 行として履歴タイムスタンプを保存します。原理的には$PWD、何も壊すことなく、タイムスタンプの後の行に追加できますが、これを適切にサポートするには、いくつかの重要なコード変更が必要になります。

関連情報