履歴コマンドでエラー行を引き起こすタイムスタンプ履歴ファイル

履歴コマンドでエラー行を引き起こすタイムスタンプ履歴ファイル

履歴ファイルにエクスポートできる.bash_profile設定があります。

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

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

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

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

#1463962023
top

そのため、.bash_profileに人間が読めるタイムスタンプだけをファイルに書き込むperl one linerを作成して、epoch行を削除しました。 (および他の数行)

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

履歴コマンドが不要な行を報告せずに必要に応じてファイルに書き込む方法は何ですか?

注 – システムにログインすると、履歴コマンドのこの異常が「有効」になるようです。 (私はsshを使用しています。)セッションで10個のコマンドを実行してから履歴コマンドを実行すると、すべてが問題ないようです。ただし、ログアウトして再度ログインして履歴コマンドを実行すると、エラー行が表示されます。

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

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

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

答え1

私は履歴ファイルを保持し、プロンプト_コマンドハンドラでコマンドロギングを実装します。また、履歴ファイルの他の使用と競合しない、または/rootにアクセスしている他のユーザーとの問題が発生しないように、プライベートログファイルに記録します。

関連情報