UNIXの時間コマンドの出力をbashの変数にリダイレクトしますか?


13

私は時間コマンドの出力をキャプチャしたいだけです:

X=$(time ls)

または

$(time ls) | grep real

しかし、時間関数はコンソールにそれを吐き出します。どうすればいいですか?

回答:



11

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"になり、これを使用して「リアルタイム」になります。


これがどのように機能するかを少し説明してもらえますか?私はこのカーゴカルトスタイルのようなスニペットを何年も使用しています。ストリーム3および4 そしてその '-' ?
Sirex

1
@Sirex:ストリーム3および4はexec、利用可能なファイル記述子を使用して、私の回答のコマンドによって作成されたストリームです。利用可能な任意のファイル記述子を使用できます。ストリーム3および4は、それぞれ1(stdout)および2(stderr)のコピーです。これは、の出力が可能lsに正常に渡すstdoutstderrの出力ながら3及び4を介してtime(通常移行するstderr元にリダイレクトされる)stdout(1)と、コマンド置換を使用して変数に捕捉します。私の例でわかるように、ファイル名barbazは端末に出力されます。...
追って通知があるまで一時停止します。

1
...終了すると、余分なストリームは末尾のを使用して閉じられ-ます。
追って通知があるまで一時停止します。

4

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 ' ')

もっとおしゃれな方法がありますが、それは明確でシンプルな方法です。


-oなしでこれを行うことに興味があります。あなたが考えていた派手な方法の1つを投稿できますか?
デビッドドリア14

0

@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形式をサポートしていませんが、インストールcoreutilsbrew 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"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.