投稿

10月, 2017の投稿を表示しています

Unix 系 OS で コマンドの実行時により正確なタイムスタンプをつける

前回の記事の続編のようなもの
Unix 系 OS でコマンド実行間にタイムスタンプを付ける 前回の設定では精度が秒なので,ミリ秒やマイクロ秒が欲しいときに困る。

次のようにシェル組込みの trap コマンドを使うことでより細かい日時を正確にとれる
$ trap 'echo -e "\n$(date -I"ns")\n"' DEBUG Bash でも Zsh でも trap は特定のシグナルのハンドラ(のようなもの)をシェルに設定するものだが, シグナルではなく DEBUG を指定するとコマンドやシェル関数の実行直前に設定したコマンドを実行してくれる。
ここでは,date(1) に -I あるいは --iso-8601= でナノ秒単位の ISO 8601 形式のフォーマットを指定しているが,
date +"%F %T.%N" のように + でフォーマットを與えるのでも良かろう。

ちなみにこれを自分の手元の zsh でやったらプロンプトの文字列に色々仕込みすぎてたせいでコマンド実行前にかなりタイムタンプが出てきた上にプロンプトが若干壊れました。

Unix 系 OS でコマンド実行間にタイムスタンプを付ける

Bash や Zsh 向け。POSIX sh だとたぶん出来ない。

Bash の例
20 2017-10-23 18:30:54 echo $PATH | sed -e 's/:/\n/g'
21 2017-10-23 18:30:54 uname -a
22 2017-10-23 18:30:54 exit
23 2017-10-23 18:30:56 cd
24 2017-10-23 18:31:04 HISTTIMEFORMAT='%F %T '
25 2017-10-23 18:31:06 history Zsh の例
16384 2017-10-23 18:37:02 popd
16385 2017-10-23 18:38:30 ls
16386 2017-10-23 18:38:31 pwd
16387 2017-10-23 18:38:34 cd Desktop
16388 2017-10-23 18:38:37 cd
16389 2017-10-23 18:38:39 exit ではどうやってやるか紹介。
まず Bash,これは次のように環境変数を設定すれば良い
export HISTTIMEFORMAT="%F %T " この環境変数は日時以外も色々文字列を埋めることができる。ここで使える書式指定子は,おおむね strftime(3) に従っているのでこれの man page を見ると良い。
だがしかしミリ秒やマイクロ秒といった単位は使えないのか %L や %N は無視される……。

次に Zsh。
setopt extended_history これを .zshrc に書けば,history コマンドを使うときに,
history -i an zshbuiltinan zshbuiltinなどオプションを與えることで実行時間が出てくる。
-i 以外にも様々なオプションがあり,
-d オプションは日付しか出さないが,-f を加えるとアメリカ式で年月日も表示する。
Bash のように好きなフォーマットで出力するには,
history -t "%F %T " のように -t オプションに strftime(3) に準じる書式指定子…