Bagaimana cara mengarahkan output dari perintah "waktu"?


95

Saya mencoba mengalihkan output dari perintah waktu, tetapi saya tidak bisa:

$time ls > filename
real    0m0.000s
user    0m0.000s
sys     0m0.000s

Dalam file tersebut saya dapat melihat output dari lsperintah, bukan dari time. Tolong jelaskan, mengapa saya tidak bisa dan bagaimana melakukan ini.


1
Seharusnya di Superuser, kurasa.
Mnementh

1
Jawaban atas pertanyaan ini tidak hanya menarik bagi pemrogram, tetapi juga untuk pengguna daya lainnya: superuser.com
Mnementh

Jawaban:


104

Anda dapat mengarahkan keluaran waktu menggunakan,

(time ls) &> file

Karena Anda perlu menggunakan (waktu ls) sebagai satu perintah sehingga Anda dapat menggunakan tanda kurung.


1
ya baik-baik saja, tapi pertanyaannya adalah bagaimana mereka melakukan ini?
abubacker

2
perintah waktu akan mengambil argumen sebagai perintah. Tetapi tanda kurung akan mengelompokkannya sebagai satu perintah. Contoh: waktu ls> file1.txt Dalam argumen, 0 = waktu 1 = "ls> file1.txt"
sganesh

8
Dan perintah waktu mencetak keluaran dalam stderr. Jadi Anda dapat menggunakan (waktu ls) 2> file
sganesh

5
Klarifikasi di &>tolong, di mana saya bisa belajar tentang ini?
hello_there_andy

3
@hello_there_andy &>filedapat dianalogikan dengan >file 2>&1. Ini mengarahkan stdout dan stderr.
ktbiz

130

tidak perlu meluncurkan sub shell. Gunakan blok kode juga akan berhasil.

{ time ls; } 2> out.txt

atau

{ time ls > /dev/null 2>&1 ; } 2> out.txt

1
Setuju, Jawaban terbaik. Memberi Anda pilihan untuk mengabaikan hasil ls dan hanya mendapatkan waktu. Terima kasih ghostdog74
rd42

1
Ini bekerja dengan AIX ketika tidak ada yang bisa mengarahkan output dari perintah "hostent". Terima kasih!
Hugo

1
Klarifikasi di 2>tolong. Di mana saya dapat mempelajari tentang ini?
hello_there_andy

3
bagaimana cara melakukannya jika saya menginginkan keduanya> dan 2> pada saat yang bersamaan?
Jorge Fernández-Hidalgo

25

Waktu perintah mengirimkan outputnya ke STDERR (bukan STDOUT). Itu karena perintah dieksekusi dengan waktu normal (dalam hal ini ls) dikeluarkan ke STDOUT.

Jika Anda ingin menangkap keluaran waktu, ketik:

(time ls) 2> filename

Itu hanya menangkap keluaran waktu, tetapi keluaran ls berjalan normal ke konsol. Jika Anda ingin menangkap keduanya dalam satu file, ketik:

(time ls) &> filename

2> mengalihkan STDERR, &> mengalihkan keduanya.


1
Jawaban ini sebenarnya menjawab mengapa pengalihan OP tidak berfungsi, yang merupakan salah satu pertanyaan yang diajukan OP. Tidak ada orang lain yang membahas ini.
NeutronStar

bagaimana satu pipa ke proses lain dengan ini?
Paul

10

waktu adalah shell builtin dan saya tidak yakin apakah ada cara untuk mengalihkannya. Namun Anda dapat menggunakan /usr/bin/timesebagai gantinya, yang pasti menerima pengalihan keluaran apa pun.


/ usr / bin / waktu - nama file keluaran ls
chub

4
Waktu bawaan bekerja dengan baik dengan pengalihan keluaran. Ini hanya menghasilkan pada STDERR, bukan pada STDOUT.
Mnementh

Masalahnya adalah bahwa perintah bawaan dijalankan dalam lingkungan shell itu sendiri, bukan subkulit. Karena stderr shell Anda biasanya terhubung ke terminal, pengalihan tidak akan melakukan apa pun. Untuk mengarahkan waktu bawaan, saya yakin Anda harus melakukan sesuatu seperti bash time mycmd 2>file. Atau panggil saja /usr/bin/timeseperti yang disebutkan.
ktbiz

Anda juga dapat menggunakan non-built-in tanpa menentukan jalur lengkap: stackoverflow.com/questions/29540540/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

4

Jika Anda tidak ingin mencampur output dari timedan perintah. Dengan waktu GNU, Anda dapat menggunakan -o fileseperti:

/usr/bin/time -o tim grep -e k /tmp 1>out 2>err

while timadalah keluaran waktu, outdan errstdout dan stderr dari grep.


4

Alasan mengapa pengalihan tampaknya tidak berhasil timeadalah karena kata tersebut merupakan kata cadangan bash (bukan bawaan!) Saat digunakan di depan pipeline. pesta (1):

Jika kata time reserved mendahului pipeline, waktu yang telah berlalu serta waktu pengguna dan sistem yang dikonsumsi oleh eksekusinya dilaporkan saat pipeline dihentikan.

Jadi, untuk mengalihkan keluaran time, gunakan tanda kurung kurawal:

{ time ls; } 2> filename

Atau hubungi /usr/bin/time:

/usr/bin/time ls 2> filename

0

Saya menggunakan pengalihan metode stdout dan stderr dengan kawat gigi untuk pengujian.
Ini &>>rptmewakili ini >>rpt 2>&1tetapi lebih pendek.
Tanda kurung akan menjalankan perintah di shell saat ini. Lihat: pesta pria

{ time ls a*; } &>>rpt
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.