Widzenie „Broken pipe” w tej sytuacji jest rzadkie, ale normalne.
Po uruchomieniu type rvm | head -1
bash wykonuje się type rvm
w jednym procesie, head -1
w innym. 1 Stdout type
jest podłączony do końca „zapisu” potoku , a stdin head
do końca „odczytu”. Oba procesy działają w tym samym czasie.
head -1
Proces odczytuje dane ze standardowego wejścia (zwykle kawałki 8 KB) drukuje jednej linii (w zależności od -1
wariantu) i wyjścia, co powoduje „Czytaj” koniec rury, która ma być zamknięty. Ponieważ rvm
funkcja jest dość długa (około 11 kB po przeanalizowaniu i zrekonstruowaniu przez bash), oznacza to, że head
kończy działanie, type
wciąż mając kilka kB danych do zapisania.
W tym momencie, ponieważ type
próbuje napisać do potoku, którego drugi koniec został zamknięty - zepsuty potok - funkcja write (), którą skalował, zwróci błąd EPIPE, przetłumaczony jako „zepsuty potok”. Oprócz tego błędu jądro wysyła również sygnał SIGPIPE type
, który domyślnie zabija proces natychmiast.
(Sygnał jest bardzo przydatny w interaktywnych powłokach, ponieważ większość użytkowników nie chce, aby pierwszy proces działał dalej i próbował pisać do nikąd. Tymczasem usługi nieinteraktywne ignorują SIGPIPE - nie byłoby dobrze, aby długo działający demon umierają na tak prosty błąd - dlatego uważają, że kod błędu jest bardzo przydatny).
Jednak dostarczanie sygnału nie jest w 100% natychmiastowe i mogą wystąpić przypadki, gdy write () zwraca EPIPE, a proces kontynuuje działanie przez krótką chwilę przed otrzymaniem sygnału. W takim przypadku type
dostaje wystarczająco dużo czasu, aby zauważyć nieudany zapis, przetłumaczyć kod błędu, a nawet wydrukować komunikat o błędzie do stderr, zanim zostanie zabity przez SIGPIPE. (Komunikat o błędzie brzmi „-bash: type:”, ponieważ type
jest to wbudowane polecenie samego basha.)
Wydaje się, że jest to bardziej powszechne w systemach wieloprocesorowych, ponieważ type
proces i kod dostarczania sygnału jądra mogą działać na różnych rdzeniach, dosłownie w tym samym czasie.
Byłoby możliwe usunięcie tego komunikatu przez załatanie type
wbudowanego (w kodzie źródłowym bash), aby natychmiast wyjść, gdy otrzyma EPIPE z funkcji write ().
Nie należy się jednak tym przejmować i nie ma to żadnego związku z rvm
instalacją.