GNU/Linux >> Linux の 問題 >  >> Linux

シェルで最後に実行されたコマンドの実行時間を見つける方法はありますか?

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 を使用 .


    Linux
    1. CentOS / RHEL :history コマンド出力で実行されたコマンドの日時を取得する方法

    2. 実行されたシェルコマンドの結果をPythonの変数に保存する方法は?

    3. adb:adb シェルから PID を見つける

    1. 「find -mtime」コマンドの説明

    2. 検索コマンドの '{}' と {} の違いは?

    3. コマンド ラインから .iso ファイルのボリューム ID を変更する方法はありますか?

    1. Linuxatコマンドでタスクをスケジュールする

    2. Linuxシェルのコマンドラインエイリアス

    3. コマンド ラインからファイルにテキストを追加する最も簡単な方法は何ですか?