視差コマンドの出力をファイルに書き込むことはできますか?
たとえば、次のように試しました。
$ time foo.sh > bar.txt
ただし、foo.shからの出力のみがbar.txtに供給されます。
答え1
多くのシェルでは、includeとksh
はzsh
タイムパイプに使用されるキーワードですbash
。time
time foo | bar
foo
とコマンドの時間を測定しますbar
(zsh
失敗条件が表示されます)。シェルのstderrにこれを報告します。
time foo.sh > bar.txt
bar.txt
起動して実行するのにかかる時間を教えてくれますfoo.sh
。
出力をリダイレクトするには、次のようにtime
開始コンテキストからリダイレクトする必要がありますstderr
。time
{ time foo.sh; } 2> bar.txt
これ:
2> bar.txt time foo.sh
うまくいきますが、ksh93
とを使用するとbash
最初の場所ではないため、time
キーワードとして認識されません。time
注文する代わりに使用してください(他の出力形式を見つけることができ、パイプライン時間を測定しません)。
foo.sh
リダイレクト時間の出力とターゲットのエラーの両方に注意してくださいbar.txt
。時間出力のみを希望する場合は、次のものが必要です。
{ time foo.sh 2>&3 3>&-; } 3>&2 2> bar.txt
time
POSIXは、アクションがキーワードか組み込みか(パイプラインタイミングか単一コマンドか)を指定しません。したがって、移植性のために(sh
スクリプトで使用して別のUnix系システムに移植したい場合)、おそらく次のように書く必要があります。
command time -p foo.sh 2> bar.txt
foo.sh
次のように別のシェルを実行しない限り、関数、組み込み、またはパイプのエラー時間を測定したり、個別にリダイレクトすることはできません。
command time -p sh -c 'f() { blah; }; f | cat'
ただし、これは時間に追加の開始時間も含まれることを意味しますsh
。
答え2
すべてのバージョンの時間が-oおよび--outputパラメーターをサポートするわけではありません。
次のようにコマンドを実行する必要があります。
(time script.sh) 1> /dev/null 2> /tmp/logFile
これにより、script.sh の出力は /dev/null に保存され、結果は /tmp/logFile に保存されます。
STDERRとSTDOUTの両方をログファイルに保存するには、次のように実行できます。
(time script.sh) &> /tmp/logFile
答え3
/usr/bin/time
に出力されるので、stderr
リダイレクトする必要があります。
/usr/bin/time foo.sh 2>bar.txt
time
Bashの組み込み関数を使用する場合は、別の方法で作成する必要があります。
(time ls) 2>bar.txt
または、GNUはパラメータをtime
サポートしています--output
。
/usr/bin/time --output bar.txt foo.sh
答え4
出力と出力をファイルとして取得するには、次のようにしますls
。time
(time ls) &> log
time
ファイルの出力のみを取得するには、次のようにします。
(time ls) 2> log