W
tak „test” | podczas odczytu linii; wykonaj echo $ line; zrobione | grep -E "*" | grep -m3 „test”
uruchomione są cztery procesy,
yesprogram powłoki działający w tej
whilepętli
grepi
grepodpowiednio. 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
SIGPIPEs 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,
echoa drugi uruchamiający inną
grepinstancję. To ten ostatni proces jest wysyłany,
SIGPIPEa
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 whilepętli, nigdy sam się nie kończy SIGPIPEi po prostu działa dalej, odradzając potok potomny; raz po raz. Widzi, że potok potomny, który się pojawił, kończy się SIGPIPEoczywiście, ale dla powłoki działającej w whilepętli, która nie jest powodem do zakończenia pętli.
greprzecz, ponieważ widać to samo zawieszenieyes "test" | while read line; do echo $line | cat; done | head -3. Usuń| cati nie zawiesza się.