Widzenie „Broken pipe” w tej sytuacji jest rzadkie, ale normalne.
Po uruchomieniu type rvm | head -1bash wykonuje się type rvmw jednym procesie, head -1w innym. 1 Stdout typejest podłączony do końca „zapisu” potoku , a stdin headdo końca „odczytu”. Oba procesy działają w tym samym czasie.
head -1Proces odczytuje dane ze standardowego wejścia (zwykle kawałki 8 KB) drukuje jednej linii (w zależności od -1wariantu) i wyjścia, co powoduje „Czytaj” koniec rury, która ma być zamknięty. Ponieważ rvmfunkcja jest dość długa (około 11 kB po przeanalizowaniu i zrekonstruowaniu przez bash), oznacza to, że headkończy działanie, typewciąż mając kilka kB danych do zapisania.
W tym momencie, ponieważ typepró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 typedostaje 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ż typejest to wbudowane polecenie samego basha.)
Wydaje się, że jest to bardziej powszechne w systemach wieloprocesorowych, ponieważ typeproces 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 typewbudowanego (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 rvminstalacją.