Bagaimana saya bisa mengarahkan output `time` dan memerintahkan output ke pipa yang sama?

24

Misalkan saya memiliki biner yang dipanggil foo.

Jika saya ingin mengarahkan output fooke beberapa proses lain bar, saya bisa menulis ./foo | bar.

Di sisi lain, jika saya ingin timefoo, dan mengarahkan output timesaya bisa menulis time (./foo) | bar,.

Pertanyaan saya adalah, bagaimana saya bisa menempel output timeke ujung output foodan pipa melalui pipa yang sama ?

Solusi berikut ini bukan yang saya cari, karena ia memulai dua contoh proses yang terpisah bar, sementara saya ingin satu pipa bersama, ke satu contoh bar.

time (./foo | bar)  | bar

Bagi siapa saja yang penasaran, alasan untuk tidak ingin memulai dua contoh baradalah karena bardapat menjadi klien jaringan dan saya ingin informasi waktu dikirim ke server sebagai bagian dari http POSTpesan yang sama dengan proses output.

merlin2011
sumber
dijawab di sini, jawaban yang agak lebih baik: stackoverflow.com/questions/13356628/…
JDS

Jawaban:

29

Jika saya mengerti apa yang Anda minta, saya akan melakukannya. Saya menggunakan perintah ls ~dan teesebagai stand-in untuk ./foodan bar, tetapi bentuk umum dari apa yang Anda inginkan adalah ini:

$ ( time ./foo ) |& bar

CATATAN: Output dari timesudah terpasang di akhir output dari ./foo, itu hanya dilakukan pada STDERR. Untuk mengarahkan ulang melalui pipa Anda harus menggabungkan STDERR dengan STDOUT. Anda dapat menggunakan salah satu |&atau 2>&1untuk melakukannya.

$ ( time ./foo ) |& bar

-or-

$ ( time ./foo ) 2>&1 | bar

Contoh

$ ( time ls . ) |&  tee cmd.log
cmd.log
file1
file2
file3
file4
file5

real    0m0.005s
user    0m0.000s
sys     0m0.001s

Dan inilah isi file yang cmd.logdihasilkan oleh tee.

$ more cmd.log 
cmd.log
file1
file2
file3
file4
file5

real    0m0.005s
user    0m0.000s
sys     0m0.001s
slm
sumber
Perhatikan bahwa sintaks ini tidak berfungsi untuk BASH.
jvriesem
1
@jvriesem semua contohnya berasal dari bash
slm
9

timemengirimkan outputnya ke stderr alih-alih stdout secara default. Anda hanya perlu mengarahkan ulang itu ke tempat yang Anda inginkan.

Anda mengatakan "Di sisi lain, jika saya ingin timefoo, dan redirect output dari timesaya bisa menulis time (./foo) | bar,." tapi ini sebenarnya salah. Dalam hal ini, output waktu masih akan ditampilkan di konsol Anda, hanya stdout yang akan diarahkan.

Anda dapat mengarahkan stderr secara khusus dengan:

(time foo) 2>&1 | bar

atau semua pipa dengan:

(time foo) |& bar

Kurung diperlukan agar ini berfungsi dengan benar.

Kerusuhan
sumber
0

Saya menemukan bahwa ini berfungsi pada Solaris. (time ls) &> file

anisbet
sumber
1
Ini tidak berbeda dengan salah satu dari solusi yang ada
roaima