Бачити "Розбиту трубу" в цій ситуації рідко, але нормально.
Під час запуску type rvm | head -1
bash виконується type rvm
в одному процесі, head -1
в іншому. 1 Виділення type
з’єднане з кінцем труби "записувати" , а з head
"зчитувати" - "зчитувати". Обидва процеси працюють одночасно.
head -1
Процес зчитує дані зі стандартного вводу (зазвичай в шматки 8 КБ), вивести в одному рядку ( в відповідності з -1
параметром), і виходи, в результаті чого «читати» кінець труби повинен бути закритий. Оскільки rvm
функція досить довга (близько 11 кБ після розбору та реконструкції bash), це означає, що вона head
виходить, поки type
залишається кілька кБ даних, щоб виписати.
З цього моменту, оскільки type
намагається записати в трубу, інший кінець якої закритий - зламана труба - функція write (), яку вона викликала, поверне помилку EPIPE, перекладену як "Розбита труба". Крім цієї помилки, ядро також передає сигнал SIGPIPE type
, який за замовчуванням вбиває процес негайно.
(Сигнал дуже корисний в інтерактивних оболонках, оскільки більшість користувачів не хочуть, щоб перший процес продовжував працювати і намагався писати в нікуди. Тим часом, неінтерактивні сервіси ігнорують SIGPIPE - це не було б добре для довгого демона, щоб померти від такої простої помилки - тому вони вважають код помилки дуже корисним.)
Однак подача сигналу не є на 100% негайною, і можуть бути випадки, коли write () повертає EPIPE, і процес продовжує тривати ненадовго до отримання сигналу. У цьому випадку type
отримує достатньо часу, щоб помітити невдале записування, перекласти код помилки і навіть надрукувати повідомлення про помилку в stderr, перш ніж його вбити SIGPIPE. (Повідомлення про помилку говорить "-bash: type:" оскільки type
це сама вбудована команда bash.)
Це, мабуть, частіше зустрічається в системах з декількома процесорами, оскільки type
процес і код доставки сигналу ядра можуть працювати на різних ядрах, буквально одночасно.
Можна було б видалити це повідомлення, виправляючи type
вбудований (у вихідному коді bash) негайний вихід, коли він отримує EPIPE від функції write ().
Однак це нічого не турбує, і це rvm
ніяк не пов'язане з вашою установкою.