Misalkan saya memiliki biner yang dipanggil foo
.
Jika saya ingin mengarahkan output foo
ke beberapa proses lain bar
, saya bisa menulis ./foo | bar
.
Di sisi lain, jika saya ingin time
foo, dan mengarahkan output time
saya bisa menulis time (./foo) | bar
,.
Pertanyaan saya adalah, bagaimana saya bisa menempel output time
ke ujung output foo
dan 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 bar
adalah karena bar
dapat menjadi klien jaringan dan saya ingin informasi waktu dikirim ke server sebagai bagian dari http POST
pesan yang sama dengan proses output.
sumber
Jawaban:
Jika saya mengerti apa yang Anda minta, saya akan melakukannya. Saya menggunakan perintah
ls ~
dantee
sebagai stand-in untuk./foo
danbar
, tetapi bentuk umum dari apa yang Anda inginkan adalah ini:CATATAN: Output dari
time
sudah 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|&
atau2>&1
untuk melakukannya.Contoh
Dan inilah isi file yang
cmd.log
dihasilkan olehtee
.sumber
time
mengirimkan 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
time
foo, dan redirect output daritime
saya bisa menulistime (./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:
atau semua pipa dengan:
Kurung diperlukan agar ini berfungsi dengan benar.
sumber
Saya menemukan bahwa ini berfungsi pada Solaris.
(time ls) &> file
sumber