W
tak „test” | podczas odczytu linii; wykonaj echo $ line; zrobione | grep -E "*" | grep -m3 „test”
uruchomione są cztery procesy,
yes
program powłoki działający w tej
while
pętli
grep
i
grep
odpowiednio. Ostatni proces w potoku kończy się, zamykając czytany koniec potoku wejściowego po trzech dopasowaniach. Rurociąg kończy się następnie łańcuchem
SIGPIPE
s w zwykły sposób dla rurociągów przedwcześnie zakończonych, ponieważ każdy etap rurociągu z kolei kończy się zapisem na zepsutej rurze.
W
tak „test” | podczas odczytu linii; wykonaj echo $ line | grep -E "*"; zrobione | grep -m3 „test”
działają trzy procesy
yes
, odpowiednio program powłoki
grep
. Ale drugi proces, ten, w którym uruchomiony jest program powłoki, nieustannie odradza dwa
kolejne procesy potomne, jeden wykonujący,
echo
a drugi uruchamiający inną
grep
instancję. To ten ostatni proces jest wysyłany,
SIGPIPE
a
nie proces uruchamiający program powłoki. Jest to ten ostatni proces, który w rzeczywistości polega na pisaniu na zepsutej rurze.
Konsekwencją tego jest to, że drugi etap potoku, powłoka działająca w tej while
pętli, nigdy sam się nie kończy SIGPIPE
i po prostu działa dalej, odradzając potok potomny; raz po raz. Widzi, że potok potomny, który się pojawił, kończy się SIGPIPE
oczywiście, ale dla powłoki działającej w while
pętli, która nie jest powodem do zakończenia pętli.
grep
rzecz, ponieważ widać to samo zawieszenieyes "test" | while read line; do echo $line | cat; done | head -3
. Usuń| cat
i nie zawiesza się.