完全には説明できないbashtimeキーワードコマンドがありますが、それは機能します。
私の目標:
-
bashスクリプト内から、変数btwを受け取るPythonスクリプトの実行時間を見つけて、その値を取得します。
-
また、成功または失敗の分析のために、Pythonスクリプトの出力を同じ変数にキャプチャします。
読んだ後、私はこのコマンドに行き着きましたが、それを完全に説明することはできません。
ttime=$( (TIMEFORMAT="%U^"; time /../myscript.py ${__myvar} 2>&1 )|& tr -d f)
2番目のコマンドtr -d f
が必要な理由を説明してください パイプ内で、コマンドの出力に追加される時間値について
'tr -d f'の選択は完全に任意であり、スクリプトの出力、stdまたはerrには影響しませんが、それがない場合、またはスクリプトのテキスト出力にマイナーな方法で作用する別のコマンドがない場合は、時間が追加されていないPython、なぜですか?
編集:
本当の問題は、なぜ|& tr -d f
なのかということでした。 。必要であり、ステファニーが言うように、時間キーワードからsterrで見つかったタイミングをパイプライン出力に渡すことができるのは|&です
ソリューションは次のようになります:
ttime=$(TIMEFORMAT="%U^"; { time /../myscript.py ${__myvar} ; } 2>&1 )
フィールド記述子チュートリアル:
http://wiki.bash-hackers.org/howto/redirection_tutorial
承認された回答:
bash
で 、ksh
のように 、time
キーワードです (組み込みではない)パイプラインの時間を計測するために使用されます (単純なコマンドだけでなく、複合コマンドの時間を計ることもできます。)
time cmd 2> something
で 、cmd 2> something
のタイミングをとっています 出力をstderrに出力しますが、元のstderrに出力します。
stderrを前にリダイレクトする必要があります time
コンストラクトが呼び出されます。 |&
でどちらを行うか サブシェルのtime
のstdoutとstderrをリダイレクトします が実行されますが、それを行うためのはるかに簡単な方法は次のようになります:
time=$(TIMEFORMAT="%U^"; { time cmd; } 2>&1)
これにはサブシェルは含まれません(ここではコマンドグループを使用します) 代わりに)または追加のコマンドもありません。
bash
を使用することに注意してください :
time=$(time (cmd) 2>&1)
偶然に動作します。将来のバージョンで変更される可能性があり、time
を持つ他のシェルでは機能しないため、これには依存しません。 キーワード。
$time
のタイミング出力のみが必要な場合 (コマンドのstdoutやstderrではありません)、次のようにします:
{ time=$(TIMEFORMAT="%U^"; { time cmd 2>&3 3>&-; } 2>&1); } 3>&1