Saya tidak pernah benar-benar memikirkan bagaimana shell benar-benar mengeksekusi perintah yang disalurkan. Saya selalu diberi tahu bahwa “stdout dari satu program di-pipe ke dalam stdin orang lain,” sebagai cara berpikir tentang pipa. Jadi tentu saja, saya berpikir bahwa dalam kasus katakanlah, A | B
, A
akan dijalankan terlebih dahulu, lalu B
mendapatkan stdout dari A
, dan menggunakan stdout dari A
sebagai masukannya.
Tetapi saya perhatikan bahwa ketika orang menelusuri proses tertentu di ps
, mereka akan menyertakan grep -v "grep"
di akhir perintah untuk memastikan bahwa grep
tidak muncul pada hasil akhir.
Artinya pada perintah ps aux | grep "bash" | grep -v "grep"
tersirat bahwa ps
tahu bahwa grep
sedang berjalan dan oleh karena itu dalam output ps
. Tetapi jika ps
selesai berjalan sebelum outputnya disalurkan ke grep
, bagaimana ia tahu bahwa grep
sedang berlari?
[email protected]: ~$ ps | grep ".*"
PID TTY TIME CMD
3773 pts/0 00:00:00 bash
3784 pts/0 00:00:00 ps
3785 pts/0 00:00:00 grep
Jawaban yang Diterima:
Perintah yang disalurkan berjalan secara bersamaan. Saat Anda menjalankan ps | grep …
, ini adalah undian keberuntungan (atau soal detail cara kerja shell yang dikombinasikan dengan fine-tuning scheduler jauh di dalam perut kernel) apakah ps
atau grep
dimulai terlebih dahulu, dan bagaimanapun mereka terus mengeksekusi secara bersamaan.
Ini sangat umum digunakan untuk memungkinkan program kedua memproses data seperti yang keluar dari program pertama, sebelum program pertama menyelesaikan operasinya. Misalnya
grep pattern very-large-file | tr a-z A-Z
mulai menampilkan baris yang cocok dalam huruf besar bahkan sebelum grep
telah selesai melintasi file besar.
grep pattern very-large-file | head -n 1
menampilkan baris pertama yang cocok, dan mungkin berhenti memproses sebelum grep
telah selesai membaca file inputnya.
Jika Anda membaca di suatu tempat bahwa program pipa berjalan secara berurutan, tinggalkan dokumen ini. Program pipa berjalan secara bersamaan dan selalu begitu.