Saya bertanya-tanya bagaimana memahami yang berikut ini:
Memiping stdout dari sebuah perintah ke stdin yang lain adalah teknik
yang kuat. Tetapi, bagaimana jika Anda perlu mem-pipe stdout dari beberapa
perintah? Di sinilah proses substitusi masuk.
Dengan kata lain, dapatkah proses substitusi melakukan apa pun yang dapat dilakukan pipa?
Apa yang bisa dilakukan proses substitusi, tetapi pipa tidak?
Jawaban yang Diterima:
Cara yang baik untuk mengetahui perbedaan di antara mereka adalah dengan melakukan sedikit eksperimen pada baris perintah. Terlepas dari kesamaan visual dalam penggunaan <
karakter, ia melakukan sesuatu yang sangat berbeda dari pengalihan atau pipa.
Mari gunakan date
perintah untuk pengujian.
$ date | cat
Thu Jul 21 12:39:18 EEST 2011
Ini adalah contoh yang tidak berguna tetapi ini menunjukkan bahwa cat
menerima keluaran date
pada STDIN dan meludahkannya kembali. Hasil yang sama dapat dicapai dengan proses substitusi:
$ cat <(date)
Thu Jul 21 12:40:53 EEST 2011
Namun apa yang baru saja terjadi di balik layar berbeda. Alih-alih diberi aliran STDIN, cat
sebenarnya melewati nama file yang perlu dibuka dan dibaca. Anda dapat melihat langkah ini dengan menggunakan echo
bukannya cat
.
$ echo <(date)
/proc/self/fd/11
Ketika cat menerima nama file, ia membaca konten file untuk kami. Di sisi lain, echo baru saja menunjukkan kepada kami nama file yang diteruskan. Perbedaan ini menjadi lebih jelas jika Anda menambahkan lebih banyak substitusi:
$ cat <(date) <(date) <(date)
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
$ echo <(date) <(date) <(date)
/proc/self/fd/11 /proc/self/fd/12 /proc/self/fd/13
Dimungkinkan untuk menggabungkan substitusi proses (yang menghasilkan file) dan pengalihan input (yang menghubungkan file ke STDIN):
$ cat < <(date)
Thu Jul 21 12:46:22 EEST 2011
Kelihatannya hampir sama tetapi kali ini cat dilewatkan aliran STDIN alih-alih nama file. Anda dapat melihat ini dengan mencobanya dengan echo:
$ echo < <(date)
<blank>
Karena echo tidak membaca STDIN dan tidak ada argumen yang diteruskan, kami tidak mendapatkan apa-apa.
Pengalihan pipa dan input mendorong konten ke aliran STDIN. Substitusi proses menjalankan perintah, menyimpan outputnya ke file sementara khusus dan kemudian meneruskan nama file itu sebagai pengganti perintah. Perintah apa pun yang Anda gunakan memperlakukannya sebagai nama file. Perhatikan bahwa file yang dibuat bukanlah file biasa tetapi sebuah pipa bernama yang akan dihapus secara otomatis setelah tidak lagi diperlukan.
Terkait:Apakah peristiwa yang difilter di Monitor Proses disimpan di memori atau di disk?