私は何かを使って時間を計ろうとしています:
/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
何か案は?
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