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操作を調整できます。cdpushdpopd

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

HISTTIMEFORMAT(魅力的なオプションの1つは関数で動的に変更することですが、PROMPT_COMMANDこれは履歴ファイルに追加されず、履歴が表示されたときにのみ適用されるため、必要に応じて機能しません。)

Bashは#nnnn各コマンド項目の上に過去のタイムスタンプを(epoch秒)行として保存します。原則として、$PWD何も壊れずにタイムスタンプの次の行に追加できますが、それを正しくサポートするにはいくつかの重要なコード変更が必要です。

関連情報