時間コマンドの出力をリダイレクトする
1. 概要
Linuxのtimeコマンドは、実行可能ファイルの実行時間を測定します。 実行可能ファイルは、コマンド、プログラム、またはスクリプトにすることができます。
time コマンドは、その出力を標準エラー(デフォルトではターミナルウィンドウ)に出力します。 time コマンドの出力をファイルにリダイレクトし、後で使用する必要がある場合があります。
このチュートリアルでは、timeコマンドの出力をファイルにリダイレクトする方法について説明します。
2. リダイレクトの問題
time コマンドを使用して、コマンドの継続時間を測定してみましょう。
$ time sleep 2
real 0m2.003s
user 0m0.001s
sys 0m0.002s
time sleep 2 コマンドを実行したとき、 sleep2コマンドの実行に費やされた実際の時間は2.003秒かかりました。 time コマンドの出力には、実行可能ファイルがユーザーモードとカーネルモードで使用するCPU秒も含まれます。
したがって、上記の例では、ユーザーモードで費やされたCPU時間は 0.001 秒であり、カーネルモードで費やされたCPU時間は0.002秒でした。
次に、同じ例を再実行しますが、timeコマンドの標準エラーをファイルにリダイレクトします。
$ time sleep 2 2> out.time
real 0m2.005s
user 0m0.002s
sys 0m0.002s
ご覧のとおり、標準エラーをファイル out.time にリダイレクトしましたが、timeコマンドの出力はターミナルウィンドウに出力されたままでした。 out.timeファイルの内容を確認してみましょう。
$ cat out.time
$
標準エラーのリダイレクトにもかかわらず、ファイルは空です。 これは、timeコマンドが2>out.timeをsleepコマンドの一部として実行時間を測定するかのように解釈するためです。 sleep 2 2>out.timeコマンドの コマンドsleep2 は何も出力しないため、ファイルは空です。
3. time組み込みコマンド
3.1. timeをグループに入れる
time コマンドの出力をファイルに適切にリダイレクトするための解決策として、 time コマンドを中括弧でグループ化し、グループの出力をリダイレクトできます。
$ { time sleep 2; } 2> out.time
$ cat out.time
real 0m2.002s
user 0m0.002s
sys 0m0.000s
今、私たちは目標を達成しました。 timeコマンドをグループ化する理由は、リダイレクト部分2> out.timeをtimeコマンドから分離するためです。分離の結果、リダイレクト部分はの一部として評価されません。 timeコマンドに渡されたコマンド。
中括弧を使用してコマンドをグループ化すると、現在のシェルの中括弧の間でコマンドが実行されます。 コマンドの最後にセミコロンが必要です。セミコロンを使用しないと、構文エラーが発生します。
3.2. 出力ファイルに到達するすべてのエラーの防止
上記の解決策には欠点があります。 time コマンドに渡された実行可能ファイルが標準エラーに何かを出力する場合、timeコマンドと実行可能ファイルの両方の出力が同じファイルに書き込まれます。 例として、スクリプトsleepy_hello_world.shがあるとします。
#!/bin/bash
echo "Hello World to Standard Output" >&1
echo "Hello World to Standard Error" >&2
sleep 2
このスクリプトは、1番目と2番目のechoコマンドの出力をそれぞれ標準出力と標準エラーに出力します。 その後、2秒間スリープします。
time コマンドを中括弧でグループ化して、このスクリプトを実行してみましょう。
$ { time sleepy_hello_world.sh; } 2> out.time
Hello World to Standard Output
$ cat out.time
Hello World to Standard Error
real 0m2.006s
user 0m0.005s
sys 0m0.001s
ご覧のとおり、スクリプトの2番目のechoコマンドの出力とtimeコマンドの出力は同じファイルに書き込まれました。 ただし、タイミングをとっているコマンドの stderr をファイルに転送することで、出力を分離できます。
$ { time sleepy_hello_world.sh 2> out.script; } 2> out.time
Hello World to Standard Output
$ cat out.script
Hello World to Standard Error
$ cat out.time
real 0m2.006s
user 0m0.002s
sys 0m0.004s
4. / usr / bin /timeコマンド
これまで使用してきたtimeコマンドは、Bashが提供する組み込みのtimeコマンドです。 実際、使用できるtimeコマンドがもう1つあります。
type コマンドを使用して、使用可能なtimeコマンドを確認してみましょう。
$ type -a time
time is a shell keyword
time is /bin/time
time is /usr/bin/time
最初のtimeコマンド/bin / time は、これまで使用してきた組み込みのtimeコマンドです。
$ which time
/bin/time
組み込みのtimeコマンドの代わりに、2番目のtimeコマンド/usr / bin /timeを使用できます。 また、実行可能ファイルをパラメーターとして受け取り、実行して、最後に実行時間を表示します。
$ /usr/bin/time -p sleep 2
real 2.00
user 0.00
sys 0.00
/ usr / bin / timeコマンドの–p オプションは、出力をフォーマットするためのものです。 また、 –oオプションというもう1つの興味深いオプションがあります。 このオプションはファイル名を取ります。 / usr / bin / timeコマンドの出力を、–oオプションで指定されたファイルに書き込むことができます。
$ /usr/bin/time -p -o out.time sleep 2
$ cat out.time
real 2.00
user 0.00
sys 0.00
それが私たちが望んでいることです。 / usr / bin / timeコマンドに渡された実行可能ファイルの出力は、/ usr / bin/timeコマンドの出力と混合されません次のいずれかです。
$ /usr/bin/time -p -o out.time sleepy_hello_world.sh
Hello World to Standard Output
Hello World to Standard Error
$ cat out.time
real 2.00
user 0.00
sys 0.00
man time を使用して、 / usr / bin /timeコマンドのマニュアルページを表示できます。 help time を使用して、組み込みのtimeコマンドに関する情報を取得できます。
5. 結論
このチュートリアルでは、timeコマンドの出力をリダイレクトするための2つの代替方法について説明しました。
最初に、組み込みの time コマンドについて説明し、リダイレクトにコマンドのグループ化を使用しました。 次に、出力をファイルにリダイレクトするための –oオプションを持つ/ usr / bin /timeコマンドについて説明しました。