履歴ファイルにエクスポートするための .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 にアクセスする際の問題が発生しなくなります。