Penjelasan yang tepat telah diberikan oleh jsbillings dan geekosaur , tetapi biarkan saya sedikit memperluasnya.
Di sebagian besar shell, termasuk bash, setiap sisi pipa berjalan dalam subkulit, sehingga setiap perubahan dalam kondisi internal shell (seperti variabel pengaturan) tetap terbatas pada segmen pipa tersebut. Satu-satunya informasi yang dapat Anda peroleh dari subkulit adalah apa yang ditampilkannya (ke keluaran standar dan deskriptor file lainnya) dan kode keluarnya (yang merupakan angka antara 0 dan 255). Misalnya, cuplikan berikut mencetak 0:
a=0; a=1 | a=2; echo $a
Dalam ksh (varian yang berasal dari kode AT&T, bukan varian pdksh / mksh) dan zsh, item terakhir dalam sebuah pipa dieksekusi di shell induk. (POSIX memungkinkan kedua perilaku.) Jadi potongan di atas mencetak 2.
Sebuah idiom yang berguna adalah memasukkan kelanjutan loop sementara (atau apa pun yang Anda miliki di sisi kanan pipa, tetapi loop sementara sebenarnya umum di sini) dalam pipa:
cat junk | {
while read var ; do x=55 ; done
echo x=$x
}