Ver "Tubo quebrado" nessa situação é raro, mas normal.
Quando você executa type rvm | head -1
, o bash é executado type rvm
em um processo, head -1
em outro. 1 O stdout de type
está conectado à extremidade "write" de um pipe , o stdout da extremidade head
"read". Ambos os processos são executados ao mesmo tempo.
O head -1
processo lê os dados do stdin (geralmente em pedaços de 8 kB), imprime uma única linha (de acordo com a -1
opção) e sai, fazendo com que a extremidade "lida" do tubo seja fechada. Como a rvm
função é bastante longa (cerca de 11 kB após ser analisada e reconstruída pelo bash), isso significa que head
sai enquanto type
ainda há alguns kB de dados para gravar.
Neste ponto, como type
está tentando gravar em um pipe cuja outra extremidade foi fechada - um pipe quebrado - a função write () que ele chamou retornará um erro EPIPE, traduzido como "Pipe quebrado". Além desse erro, o kernel também envia o sinal SIGPIPE para type
, que por padrão mata o processo imediatamente.
(O sinal é muito útil em shells interativos, pois a maioria dos usuários não deseja que o primeiro processo continue em execução e tente gravar em lugar nenhum. Enquanto isso, serviços não interativos ignoram o SIGPIPE - não seria bom para um daemon de longa execução morrem com um erro tão simples - para que eles achem o código de erro muito útil.)
No entanto, a entrega do sinal não é 100% imediata e pode haver casos em que write () retorne o EPIPE e o processo continue em execução por um curto período de tempo antes de receber o sinal. Nesse caso, type
obtém tempo suficiente para observar a falha na gravação, traduzir o código de erro e até imprimir uma mensagem de erro no stderr antes de ser morto pelo SIGPIPE. (A mensagem de erro diz "-bash: type:", pois type
é um comando interno do próprio bash.)
Isso parece ser mais comum em sistemas com várias CPUs, pois o type
processo e o código de entrega de sinal do kernel podem ser executados em núcleos diferentes, literalmente ao mesmo tempo.
Seria possível remover esta mensagem type
corrigindo o código interno (no código-fonte do bash) para sair imediatamente quando receber um EPIPE da função write ().
No entanto, não há com o que se preocupar e não está relacionado à sua rvm
instalação de forma alguma.