Видеть "Сломанную трубу" в этой ситуации редко, но нормально.
Когда вы запускаете, type rvm | head -1
, bash выполняет type rvm
в одном процессе, head -1
в другом. 1 Stdout type
подключается к концу "write" канала , а stdin head
к концу "read". Оба процесса выполняются одновременно.
Процесс head -1
читает данные из стандартного ввода (обычно кусками по 8 кБ), выводит одну строку (в соответствии с параметром -1
) и завершается, вызывая закрытие конца канала для чтения. Поскольку функция rvm
довольно длинная (около 11 кБ после анализа и восстановления с помощью bash), это означает, что head
завершается, а type
все еще имеет несколько кБ данных для записи.
На этом этапе, поскольку type
пытается выполнить запись в канал, другой конец которого был закрыт - сломанный канал - вызываемая им функция write() вернет ошибку EPIPE, переведенную как "Broken pipe". В дополнение к этой ошибке ядро также отправляет сигнал SIGPIPE на type
, который по умолчанию немедленно убивает процесс.
(Сигнал очень полезен в интерактивных оболочках, поскольку большинство пользователей не хотят, чтобы первый процесс продолжал выполняться и пытался писать в никуда. Между тем, неинтерактивные сервисы игнорируют SIGPIPE - было бы нехорошо для давно работающего демона умереть от такой простой ошибки - поэтому они находят код ошибки очень полезным.)
Однако доставка сигнала не происходит на 100% немедленно, и могут быть случаи, когда write() возвращает EPIPE, и процесс продолжается некоторое время, пока не получит сигнал. В этом случае type
получает достаточно времени, чтобы заметить неудачную запись, перевести код ошибки и даже напечатать сообщение об ошибке в stderr перед тем, как SIGPIPE будет уничтожен. (Сообщение об ошибке гласит «-bash: type:», так как type
является встроенной командой самого bash.)
Похоже, что это чаще встречается в многопроцессорных системах, поскольку процесс обработки type
и код доставки сигналов ядра могут выполняться на разных ядрах, буквально одновременно.
Можно было бы удалить это сообщение, исправив встроенный type
(в исходном коде bash) для немедленного выхода при получении EPIPE от функции write ().
Тем не менее, это не о чем беспокоиться, и это никак не связано с вашей установкой rvm
.