私は時間コマンドの出力をキャプチャしたいだけです:
X=$(time ls)
または
$(time ls) | grep real
しかし、時間関数はコンソールにそれを吐き出します。どうすればいいですか?
私は時間コマンドの出力をキャプチャしたいだけです:
X=$(time ls)
または
$(time ls) | grep real
しかし、時間関数はコンソールにそれを吐き出します。どうすればいいですか?
回答:
BashFAQ / 032を参照してください。
$ # captures output of command and time
$ time=$( TIMEFORMAT="%R"; { time ls; } 2>&1 ) # note the curly braces
$ # captures the time only, passes stdout through
$ exec 3>&1 4>&2
$ time=$(TIMEFORMAT="%R"; { time ls 1>&3 2>&4; } 2>&1)
bar baz
$ exec 3>&- 4>&-
時刻は「0.000」のようTIMEFORMAT="%R"
になり、これを使用して「リアルタイム」になります。
exec
、利用可能なファイル記述子を使用して、私の回答のコマンドによって作成されたストリームです。利用可能な任意のファイル記述子を使用できます。ストリーム3および4は、それぞれ1(stdout
)および2(stderr
)のコピーです。これは、の出力が可能ls
に正常に渡すstdout
とstderr
の出力ながら3及び4を介してtime
(通常移行するstderr
元にリダイレクトされる)stdout
(1)と、コマンド置換を使用して変数に捕捉します。私の例でわかるように、ファイル名bar
とbaz
は端末に出力されます。...
-
ます。
Timeは、その出力をSTDOUTではなくSTDERRに書き込みます。さらに悪いことに、デフォルトでは「time」はシェル組み込みコマンドであるため、「time ls 2>&1」を試みると「2>&1」は「ls」にのみ適用されます。
解決策はおそらく次のようなものでしょう:
/usr/bin/time -f 'real %e' -o OUTPUT_FILE ls > /dev/null 2>&1<br>
REALTIME=$(cat OUTPUT_FILE | cut -f 2 -d ' ')
もっとおしゃれな方法がありますが、それは明確でシンプルな方法です。
@Dennis Williamsonの答えは素晴らしいですが、コマンドの出力を1つの変数に保存し、その出力をtime
別の変数に保存するのに役立ちません。これは、実際にはファイル記述子を使用しては不可能です。
プログラムの実行にかかる時間を記録する場合は、終了時間から開始時間を引くだけでこれを実行できます。次に、プログラムの実行にかかったミリ秒数を示す簡単な例を示します。
START_TIME=$(date +%s%3N)
OUTPUT=$(ls -l)
ELAPSED_TIME=$(expr $(date +%s%3N) - $START_TIME)
echo "Command finished in $ELAPSED_TIME milliseconds"
これはtime
コマンドほど正確ではありませんが、ほとんどのbashスクリプトで完全に機能するはずです。
残念ながら、Macのdate
コマンドはこの%N
形式をサポートしていませんが、インストールcoreutils
(brew install coreutils
)して使用できますgdate
:
START_TIME=$(gdate +%s%3N)
OUTPUT=$(ls -l)
ELAPSED_TIME=$(expr $(gdate +%s%3N) - $START_TIME)
echo "Command finished in $ELAPSED_TIME milliseconds"
time
; その点では、デニスウィリアムソンの答えの方が優れています。