web-dev-qa-db-ja.com

「time command」でコマンドの出力をリダイレクトします

私は何かを使って時間を計ろうとしています:

/usr/bin/time myCommand

ただし、/usr/bin/timeはstderrに書き込むため、myCommandもstderrに書き込む場合は、ストリームに出力されるのは時間だけではありません。私がやりたいことは、myCommandのすべての出力を/dev/nullにリダイレクトすることですが、それでも時間の出力をstderrに書き込みます。 ls /nofileのstderrに書き込む例myCommandを使用すると、次のように(明らかに)出力がまったくないことがわかります。

$ /usr/bin/time ls /nofile 2> /dev/null
$

リダイレクトがない場合、lsからの出力(stderrへ)と時間からの出力(stderrへも)の両方が表示されます。

$ /usr/bin/time ls /nofile
ls: cannot access /nofile: No such file or directory
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3776maxresident)k
0inputs+0outputs (0major+278minor)pagefaults 0swaps

私が欲しいのは単に生成するものです:

$ /usr/bin/time ls /nofile > RedirectThatImAskingFor
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3776maxresident)k
0inputs+0outputs (0major+278minor)pagefaults 0swaps

何か案は?

11
David Doria

Ksh、bash、zshでは、timeは組み込みではなくキーワードです。同じ行のリダイレクトは、タイミングがとられているコマンドにのみ適用され、time自体の出力には適用されません。

$ time ls -d / /nofile >/dev/null 2>/dev/null

real    0m0.003s
user    0m0.000s
sys     0m0.000s

これらのシェルでtime自体からの出力をリダイレクトするには、追加のグループ化レベルを使用する必要があります。

{ time mycommand 2>&3; } 3>&2 2>mycommand.time

GNUスタンドアロンのバージョン time ユーティリティを使用する場合、-oオプションは、timeの出力をstderr以外の場所に書き込みます。 timeをターミナルに書き込むことができます:

/usr/bin/time -o /dev/tty mycommand >/dev/null 2>/dev/null

標準エラー時にtimeからの出力を保持する場合は、追加レベルのファイル記述子シャッフルが必要です。

/usr/bin/time -o /dev/fd/3 mycommand 3>&2 >/dev/null 2>/dev/null

timeユーティリティを使用すると、中間シェルを呼び出して目的のリダイレクトを実行できます。 cd、リダイレクトなどの追加のアクションを実行するために中間シェルを呼び出すことはかなり一般的です。これは、シェルが行うように設計されたちょっとしたことです。

/usr/bin/time sh -c 'exec mycommand >/dev/null 2>/dev/null'
[artur@asus-ux21e ~]$ find /etc/pki/CA/private/
/etc/pki/CA/private/
find: ‘/etc/pki/CA/private/’: Permission denied
[artur@asus-ux21e ~]$ time (find /etc/pki/CA/private/ &> /dev/null)

real    0m0.006s
user    0m0.001s
sys 0m0.004s
0
Artur Szymczak