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

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

私は以下を使って時間を測定しようとしています。

/usr/bin/time myCommand

しかし/usr/bin/time、stderrに書いて以来、私の注文また、stderrに書き込むと、ストリームの時間出力以上の結果が得られます。私が望むのはmyCommandのすべての出力を次にリダイレクトします/dev/nullが、まだstderrに時間出力を書き込むことです。使用例私の注文stderr of に書き込むと、ls /nofile以下のように出力がまったく表示されません。

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

リダイレクトせずに出力(stderrに)lsと時間(また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

どんなアイデアがありますか?

ベストアンサー1

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オプションで、stderr以外の場所-oに出力を書き込むユーティリティです。端末に書き込むtimeことができます: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'

おすすめ記事