Bash timeキーワードの結果は、2番目のパイプコマンドでのみ機能します。理由を説明してください。

Bash timeキーワードの結果は、2番目のパイプコマンドでのみ機能します。理由を説明してください。

完全に説明できないbash timeキーワードコマンドがありますが、私にとっては効果的です。

私の目標:

  1. bashスクリプトから変数btwを取得し、値をキャプチャするPythonスクリプトの実行時間を見つけます。

  2. 成功または失敗の分析のために、同じ変数からPythonスクリプトの出力をキャプチャすることも可能です。

周囲を読んだ後、このコマンドを使用しましたが、説明することはできません。

ttime=$( (TIMEFORMAT="%U^"; time  /../myscript.py ${__myvar} 2>&1 )|& tr -d f)

tr -d f時間値がコマンド出力に追加されるようにパイプラインで2番目のコマンドが必要な理由を説明しますか?

"tr -df"の選択は完全に任意であり、私のスクリプトの出力、std、またはerrには影響しません。ただし、このオプションやスクリプトのテキスト出力に対してマイナーな方法で動作する他のコマンドがない場合は、次のことがわかります。 Pythonが戻ったときに余分な時間はありません。なぜですか?

編集する:

実際の質問は「なぜ」でなければなりません|& tr -d f。 Stephanieが言ったように、|&はtimeキーワードのsterrで見つかったタイミングをパイプ出力に渡すことを可能にします。

今解決策は次のとおりです。

ttime=$(TIMEFORMAT="%U^"; { time /../myscript.py ${__myvar} ; } 2>&1 )

フィールド記述子チュートリアル:

http://wiki.bash-hackers.org/howto/redirection_tutorial

ベストアンサー1

inbashは inkshtime同様キーワード(内蔵されていない)タイミング管路(簡単なコマンドだけでなく、複合コマンドも時間を設定できます。)

time cmd 2> something私たちは出力をstderrに時間を合わせてcmd 2> something印刷しますが、生のstderrで印刷します。

stderrをリダイレクトする必要があります。今後コンストラクタがtime呼び出されます。|&サブシェルのstdoutとstderrリダイレクトを使用してこれを実行できますが、timeより簡単な方法は次のとおりです。

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

おすすめ記事