タイムスタンプのあるファイルにbash_historyを書き込む

タイムスタンプのあるファイルにbash_historyを書き込む

要件は、コマンドの実行中に特定のコマンドの日付と時刻を含むファイルにコマンドライン履歴をキャプチャすることです。

以下のスクリプトは日付と時刻とともに履歴をキャプチャしますが、現在の日付と時刻を前のコマンドに割り当てます。また、履歴出力ファイルの増分バックアップを実行するようにスクリプトを拡張したいと思います。

#!/bin/bash
. ~/.bash_profile
HISTFILE=~/.bash_history
set -o history
history >/home/user/hist_`date "+%d%b%y%T"`

答え1

正確には必要ではありませんが、bash履歴のすべての行にタイムスタンプを自動的に追加できます。次の簡単な設定:

HISTTIMEFORMAT="%d%b%y%T "

historyコマンドパラメータなしこれにより、履歴項目が次のように表示されます。

23Jul1515:48:14 ls -ld .

ただし、このhistory -wコマンドは常に履歴ファイルに書き込まれます。内部形式での:

#1437659315
ls -ld .

つまり、2行の最初の行には、#コマンドと混同しないように「起源」(つまり1970年1月1日)以降の時間を秒単位で表示し、前にaを付けます。

答え2

Bashには、各コマンドのタイムスタンプを記録するようにBashに指示するオプションがあります。環境変数に有用な値を割り当てることでこれを行うことができますHISTTIMEFORMATbashマンページから:

この変数が設定されていて空でない場合、その値は、組み込みstrftime(3)履歴によって表示される各履歴項目に関連するタイムスタンプを印刷するための形式文字列として使用されます。この変数が設定されると、タイムスタンプが履歴ファイルに書き込まれ、シェルセッション全体で永続化される可能性があります。これは、履歴コメント文字を使用してタイムスタンプを他の履歴行と区別します。

HISTTIMEFORMAT有効にすると、記録された~/.bash_history各コマンドには常に2行あります。

  • 最初の行はポンド "#"記号で始まり、その後にUnixタイムスタンプ(Unix時代が始まってからの秒数)が続きます。
  • 2行目は入力したコマンドです。
    #1671097644
    cd ~/bin
    #1671097645
    ls -l
    

私の環境では

HISTTIMEFORMAT="%s (%H:%M:%S):"

ツールを呼び出すと、定義historyした形式を使用してタイムスタンプの形式が動的に指定されます。コマンドを簡単に並べ替え(%sタイムスタンプは秒単位)、読みやすく上記の形式を使用します。マイシェルで を入力すると、history次の内容が表示されます。

3  1437664568 (17:16:08):man bash
4  1437664699 (17:18:19):history

メモ:タイムスタンプロギングを有効にする前のすべてのコマンドは、プレフィックス付きのタイムスタンプ行を持たない単純なコマンドです。したがって、現在のセッションにログインしている日時スタンプが表示されます。これが面倒な場合は、前の行を見つけて置き換えて、人工的なタイムスタンプを前に追加してください。そして、記録を保存するために境界線にメモを追加します。このように:

#1671058800
ls -l
#1671058800
exit
#1671094600
echo Activated timestamp recording in the history file now.
#1671094610
echo All commands prior got the artificial timestamp 2022-12-15 00:00:00 (1671058800).
#1671094622
cd /
#1671094627
exit

編集:オペレータの質問に完全に答えられていません。

また、履歴出力ファイルの増分バックアップを実行するようにスクリプトを拡張したいと思います。

履歴ファイルの「増分バックアップ」が何を意味するのかわかりません。たぶん、定期的に記録をバックアップしたいと思うかもしれません。取ることができる方法はいくつかあります。

  • PROMPT_COMMAND変数を設定して、history -a各呼び出しの後(ログアウトを待つのではなく)コマンド履歴を継続的に更新します。
  • DEBUG 信号をキャプチャするために定義した関数を使用します。この関数は、コマンドが入力されるたびに呼び出されます。関数の中では何でもできます。 (PROMPT_COMMANDよりやや安定しています。)
  • cronjobは履歴ファイルを定期的にコピー/保存します。

関連情報