Saya mencoba mengatur waktu sesuatu menggunakan:
/usr/bin/time myCommand
Namun, sejak /usr/bin/time
menulis ke stderr, jika myCommand juga menulis ke stderr, saya akan mendapatkan lebih dari sekadar keluaran waktu di aliran. Yang ingin saya lakukan adalah, redirect semua output myCommand ke /dev/null
, tetapi masih menulis output waktu ke stderr. Menggunakan contoh myCommand yang menulis ke stderr dari ls /nofile
, kita melihat bahwa (jelas) tidak ada output sama sekali dengan yang berikut:
$ /usr/bin/time ls /nofile 2> /dev/null
$
Tanpa pengalihan apa pun, kami melihat kedua output dari ls
(ke stderr) dan output dari waktu (juga ke 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
Yang saya inginkan adalah sesuatu yang hanya menghasilkan:
$ /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
Ada ide?
Jawaban yang Diterima:
Dalam ksh, bash dan zsh, time
adalah kata kunci, bukan bawaan. Pengalihan pada baris yang sama hanya berlaku untuk perintah yang diatur waktunya, bukan untuk output time
sendiri.
$ time ls -d / /nofile >/dev/null 2>/dev/null
real 0m0.003s
user 0m0.000s
sys 0m0.000s
Untuk mengarahkan ulang output dari time
sendiri dalam cangkang ini, Anda perlu menggunakan tingkat pengelompokan tambahan.
{ time mycommand 2>&3; } 3>&2 2>mycommand.time
Jika Anda menggunakan versi GNU dari time
yang berdiri sendiri utilitas, ia memiliki -o
opsi untuk menulis output time
di tempat lain selain stderr. Anda dapat membuat time
tulis ke terminal:
/usr/bin/time -o /dev/tty mycommand >/dev/null 2>/dev/null
Jika Anda ingin menyimpan output dari time
pada kesalahan standarnya, Anda memerlukan tingkat pengacakan deskriptor file ekstra.
/usr/bin/time -o /dev/fd/3 mycommand 3>&2 >/dev/null 2>/dev/null
Dengan time
utilitas, Anda dapat memanggil shell perantara untuk melakukan pengalihan yang diinginkan. Memanggil shell perantara untuk melakukan tindakan ekstra seperti cd
, pengalihan, dll. cukup umum — ini adalah hal kecil yang dirancang untuk dilakukan oleh shell.
/usr/bin/time sh -c 'exec mycommand >/dev/null 2>/dev/null'