Te meg mutasd meg az ujjocskáddal a subshellt!
Nono, fiam, kőből talán nem lehet hidat építeni? :) Ugyanis a példád rossz, a cat és a gzip önálló, külső programok. Ezzel szemben a read az a shell belső parancsa, minek következtében ha a read-be pipe-olsz, el kell indulnia a shellnek, amely részeként fut a read, de egyben ennek a shellnek a teljesen elszeparált memória foglalásaként jelennek meg a read változói. Utána kilép, azt a memóriaterületet felszabadítja, huss, már nincs ott az értéket kapott változó, a külső shell meg néz hülyén, hogy ki akarnak íratni olyan változót, amely nem kapott értéket. Hát jó, akkor az legyen ott egy nagy üresség.