Видеть «Сломанную трубу» в этой ситуации редко, но нормально.
Когда вы запускаете type rvm | head -1
, bash выполняется type rvm
в одном процессе, head -1
в другом. 1 стандартный вывод из type
подключен к «записи» конец трубы , то из стандартного ввода head
к «читать» конец. Оба процесса выполняются одновременно.
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
установкой.