bashではどうなのかわかりませんが、zshでは preexec
を定義できます と precmd
現在の時間を変数 $STARTTIME
に保存する関数 (preexec) と $ENDTIME
(precmd)なので、おおよその実行時間を見つけることができます。または、 accept-line
を定義できます time
を先頭に追加するように機能します 各コマンドの前。
更新 :これは、経過時間を $_elapsed
に格納するコードです。 配列:
preexec () {
(( $#_elapsed > 1000 )) && set -A _elapsed $_elapsed[-1000,-1]
typeset -ig _start=SECONDS
}
precmd() { set -A _elapsed $_elapsed $(( SECONDS-_start )) }
sleep 10s
を実行すると :
% set -A _elapsed # Clear the times
% sleep 10s
% sleep 2s ; echo $_elapsed[-1]
10
% echo $_elapsed
0 10 0
4 つの変数は必要ありません。名前や追加の遅延に問題はありません。 $_elapsed
に注意してください 配列は非常に大きくなる可能性があるため、最初の項目を削除する必要があります (これは次のコードで行います:(( $#_elapsed > 1000 )) && set -A _elapsed $_elapsed[-1000,-1]
).
UPDATE2 :bash で zsh スタイルの precmd と preexec をサポートするスクリプトを見つけました。 typeset -ig
を削除する必要があるかもしれません (私は $_start
を強制するためだけに使用しました 整数である必要があります)、set -A var ...
を置き換えます var=( ... )
で これを機能させるために。また、bash で配列をスライスしてその長さを取得する方法もわかりません。
スクリプト:http://www.twistedmatrix.com/users/glyph/preexec.bash.txt
UPDATE3 :1 つの問題が見つかりました:空の行で return を押した場合 preexec は実行されませんが、precmd は実行されるため、$_elapsed
で意味のない値が取得されます。 配列。これを修正するには、precmd
を置き換えます 次のコードで機能します:
precmd () {
(( _start >= 0 )) && set -A _elapsed $_elapsed $(( SECONDS-_start ))
_start=-1
}
他の人がこれらの質問に答えてから、世界は少し動いたかもしれません.
zsh
コマンドにかかる時間を計測する機能が組み込まれています。
inc_append_history_time オプションを有効にすると
setopt inc_append_history_time
次に、すべてのコマンドの実行にかかった時間が履歴に保存され、history -D
で表示できます .
この回答の構造:
<オール>上記の概要に従って、その部分によってラベル付けされた回答:
パート 1 - 簡単な答えは「いいえ」です
いいえ、申し訳ありません。 time
を使用する必要があります .
パート 2 - おそらくあなたは結果を推測することができます
場合によっては、プログラムが出力ファイルまたは情報をログ ファイルに書き込む場合、実行時間を推測できる場合がありますが、それはプログラム固有のものであり、推測にすぎません。 Bash で HISTTIMEFORMAT を設定している場合は、履歴ファイルのエントリを調べて、プログラムがいつ開始されたかを知ることができます。ただし、終了時間は記録されないため、関心のあるプログラムが終了した直後に別のプログラムが開始された場合にのみ、期間を推測できます.
パート 3 - 仮説が反証された
仮説 :アイドル時間は経過時間にカウントされます
これが私の要点を説明するための例です。 ZyX の提案に基づいています ですが、他の方法を使用しても同様です。
zsh
で :
% precmd() { prevstart=start; start=$SECONDS; }
% preexec() { prevend=$end; end=$SECONDS; }
% echo "T: $SECONDS ps: $prevstart pe: $prevend s: $start e: $end"
T: 1491 ps: 1456 pe: 1458 s: 1459 e: 1491
では、15 秒間待ちましょう。
% echo "T: $SECONDS"; sleep 10
T: 1506
では、20 秒間待ちましょう。
% echo "T: $SECONDS ps: $prevstart pe: $prevend s: $start e: $end"
T: 1536 ps: 1492 pe: 1506 s: 1516 e: 1536
ご覧のとおり、私は間違っていました .開始時刻 (1516) から 前回 を引いたもの 終了時刻 (1506) は コマンドの継続時間 (sleep 10
)。
仮説が反証された - そうです アイドル時間を含めずに正しい経過時間を取得することが可能
パート 4 - すべての経過時間を記録するためのハック コマンド
ZyX の関数に相当する Bash は次のとおりです。 回答 (そこにリンクされたスクリプトが必要です):
preexec () {
(( ${#_elapsed[@]} > 1000 )) && _elapsed=(${_elapsed[@]: -1000})
_start=$SECONDS
}
precmd () {
(( _start >= 0 )) && _elapsed+=($(( SECONDS-_start )))
_start=-1
}
preexec.bash
をインストールした後 (リンクされたスクリプトから) 上記の 2 つの関数を作成すると、実行例は次のようになります。
$ _elapsed=() # Clear the times
$ sleep 10s
$ sleep 2s ; echo ${_elapsed[@]: -1}
10
$ echo ${_elapsed[@]}
0 10 2
パート 5 - 結論
time
を使用 .