Apakah output dari satu perintah dapat disalurkan ke dua perintah lainnya?

27

Bagaimana saya bisa menyalurkan output dari satu perintah ke input dari dua perintah lainnya secara bersamaan?

Richard Hoskins
sumber
4
Iya nih. Lihat pertanyaan stackoverflow ini: stackoverflow.com/questions/670784/…
Blair Conrad

Jawaban:

56

Kedengarannya seperti teeperintah akan melakukan apa yang Anda inginkan.

Kuncinya adalah menggunakan

>( )

untuk substitusi proses . Dengan tee, gunakan pola berikut:

tee >(proc1) >(proc2) >(proc3) | proc4

Jadi jika Anda ingin menggunakan output lssebagai input ke dua grepprogram yang berbeda , simpan output masing-masing grepke file yang berbeda, dan pipa semua hasil melalui less, coba:

ls -A | tee >(grep ^[.] > hidden-files) >(grep -v ^[.] > normal-files) | less

Hasil ls -Aakan "disalurkan" ke dalam keduanya grep. File hidden-filesakan memiliki konten dari output yang pertama grep, dan normal-filesakan memiliki hasil yang kedua grep. Semua file akan ditampilkan di halaman less. EDIT : apa yang Anda lihat di lessadalah keluaran yang sama persis dari ls -A, bukan hasil dari greps. Jika Anda ingin mengubah output dari ls -Amenjadi less, (mis. Menukar urutan sehingga file normal terdaftar sebelum yang tersembunyi) kemudian coba ini:

ls -A | tee >(grep ^[.]) >(grep -v ^[.]) >/dev/null | less

Tanpa >/dev/null, output dari greps akan ditambahkan ke output ls -Aalih-alih menggantikannya.

sumber

Ben
sumber
3
ini sangat bagus!
hayalci
3
+1 karena bahkan setelah 10 tahun scripting shell, saya belum pernah melihat ini!
jtimberman
6

Gunakan "tee".

Contoh:

grep someSearchString someFile | tee /dev/tty | wc -l > grepresult

Ini akan mengirim output dari perintah grep ke terminal dan ke wc (yang outputnya diarahkan ke file grepresult).

"Tee" dijelaskan dalam tee artikel Wikipedia (perintah) . Central adalah: "Perintah tee membaca input standar, kemudian menulis kontennya ke output standar dan secara bersamaan menyalinnya ke file atau variabel yang ditentukan.".

Peter Mortensen
sumber