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


11

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

/usr/bin/time myCommand

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

$ /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

何か案は?


スクリプトファイルでtimeコマンドを使用しています。stderrの代わりにstdoutに時間を出力したい。どうすれば入手できますか?

回答:


20

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

スタンドアロンtimeユーティリティのGNUバージョンを使用する場合、stderr以外-otime場所の出力を書き込むオプションがあります。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'

いくつかのフォローアップ:1)最後の提案の「exec」は何をしますか?/ usr / bin / time sh -c 'exec ls / nofile&> ./ output.dat' 2)「中間シェル」は「サブシェル」と同じです(これにより、括弧を使用すると思いますか?)。私は/ usr / bin / time(ls / nofile&> ./ output.dat)のようなものを役に立たないように試みていました。3)/ dev / ttyとは何ですか?tty0がstdin、tty1 = stdout、tty2 = stderrであることは知っていますが、「tty」だけはどうですか?
デビッドドリア

4)/ dev / fd3オプションを使用すると、-o出力を3に書き込み、3を2に、1をnullに、2をnullにリダイレクトするように言っているようです。リダイレクトは左から右に行われるので、3をnullに送信する必要はありませんか?
デビッドドリア

1
@DavidDoria execは、サブプログラムとしてそのプログラムを実行する代わりに、指定されたプログラムでシェルを置き換えます。一部のシェルは、コマンドがスクリプトの最後のコマンドである場合に、この最適化を自動的に実行します。「中間シェル」とは、次のことを意味timemycommandます。との間にあるシェル。サブシェルとは無関係です。/dev/ttyコマンドが実行されている端末です(/dev/ttyNUM物理コンソールとは無関係です。ファイル記述子と混同します:stdin is /dev/fd/0など)。
Gilles「SO-邪悪なことをやめなさい」

@DavidDoria ファイル記述子の接続先の変更は、左から右に行われ、逆の効果があります。unix.stackexchange.com/questions/23964/…またはunix.stackexchange.com/questions/37660/order-of-redirectionsを
Gilles 'SO- stop

0
[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

それは同じ「時間」ではありません(私が信じているbashエイリアスです)。賢明なリダイレクト規則に従っていないことに注意してください。$時間&> / dev / null real 0m0.000s user 0m0.000s sys 0m0.000s
David Doria

1
これはどうですか:/ usr / bin / time -o time / usr / bin / find / etc / pki / CA / private /&> / dev / null; 猫の時間
Artur Szymczak 2014

ええ、私はそれを見たことがありますが、私は-oのような内部メカニズムを使用せずにそれを行う方法にもっと興味を持っていました。
デビッドドリア

@DavidDoria timebashエイリアスであるという印象を与えているものは何ですか。 CentOS 5.7でwhich time表示さ/usr/bin/timeれます。
ティモシーマーティン

type timeあなたが表示されます:time is a shell keyword
アルトゥルSzymczak
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.