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
できます。例:pushd
popd
[[ "$_cmd" =~ $_re1 ]] && {
history -d $_seq # remove original user command
history -s "$_cmd $_args # $_cmd \"$PWD\"" # add annotated version
}
HISTTIMEFORMAT
(関数内で動的に変更するという選択肢もありますPROMPT_COMMAND
が、これは履歴ファイルには追加されず、履歴を表示するときにのみ適用されるため、期待どおりには機能しません。)
#nnnn
Bash は、各コマンド エントリの上に (エポック秒) 行として履歴タイムスタンプを保存します。原理的には$PWD
、何も壊すことなく、タイムスタンプの後の行に追加できますが、これを適切にサポートするには、いくつかの重要なコード変更が必要になります。