履歴ファイルにタイムスタンプを設定すると、履歴コマンドにエラー行が表示される

履歴ファイルにタイムスタンプを設定すると、履歴コマンドにエラー行が表示される

履歴ファイルにエクスポートするための .bash_profile を設定しました:

export HISTFILE=/root/history/.bash_hist-$(who -m | awk '{print $1}')

次に、履歴コマンドのタイムスタンプをエクスポートします。

export HISTTIMEFORMAT="%Y/%m/%d %T "

この組み合わせにより、エポック タイム スタンプが履歴ファイルに書き込まれます。

#1463962023
top

そこで、.bash_profile に Perl のワンライナーを記述して、人間が読めるタイムスタンプのみをファイルに書き込み、エポック行を削除しました: (および他のいくつかの行)

format_history () {
local file=/root/history/.bash_hist-$(who -m | awk '{print $1}')
perl -i -pe 's/^#(\d{10})$/"# ".localtime($1)/e' "$file"
}

shopt -s histappend
PROMPT_COMMAND="history -a;format_history;$PROMPT_COMMAND"

エクスポートしたファイルは次のようになります。

# Sun May 22 19:06:41 2016
last

これは素晴らしいことであり、まさに私が望んでいたことです。ただし、これには、必要のない日付だけを含む専用行が履歴コマンドに追加されるという望ましくない副作用があります。

 824  2016/05/22 19:07:33 # Sun May 22 19:06:41 2016
 825  2016/05/22 19:07:33 last

履歴コマンドでこれらの不要な行が報告されることなく、必要なようにファイルに書き込むにはどうすればよいでしょうか?

注意 - history コマンドのこの異常は、システムにログインしたときに「アクティブ化」されるようです。(私は ssh を使用しています) セッションに参加し、10 個のコマンドを実行してから history コマンドを実行すると、すべて正常に見えます。ただし、ログアウトして再度ログインし、history コマンドを実行すると、エラーのある行が表示されます。

更新: 問題を次の行に絞り込みました:

PROMPT_COMMAND="history -a;format_history;$PROMPT_COMMAND"

この行をコメント アウトすると、history コマンドは期待どおりに動作します。ただし、これは履歴ファイルのフォーマットを実行するコマンドでもあります。行から「history -a」の部分を削除して、残りはそのままにしてみましたが、違いはありませんでした。行全体をコメント アウトしたままにした場合、perl スクリプトを使用してファイルのフォーマットを呼び出すにはどうすればよいのでしょうか。

答え1

履歴ファイルはそのままにして、代わりに prompt_command ハンドラでコマンドの記録を実装します。また、プライベート ログ ファイルに書き込むようにすると、履歴ファイルの他の使用法との競合や、他のユーザーが /root にアクセスする際の問題が発生しなくなります。

関連情報