Ver "Broken pipe" nesta situação é raro, mas normal.
Quando você executa type rvm | head -1
, o bash executa type rvm
em um processo, head -1
em outro. 1 O stdout de type
está conectado ao final "write" de um < em> pipe , o stdin de head
para o final "read". Ambos os processos são executados ao mesmo tempo.
O processo head -1
lê dados de stdin (normalmente em blocos de 8 kB), imprime uma única linha (de acordo com a opção -1
) e sai, fazendo com que a extremidade "lida" do tubo seja fechadas. Como a função rvm
é bastante longa (cerca de 11 kB depois de ser analisada e reconstruída por bash), isso significa que head
sai enquanto type
ainda tem alguns kB de dados para gravar.
Neste ponto, como type
está tentando gravar em um pipe cuja outra extremidade foi fechada - um canal quebrado - a função write () chamada retornará um erro EPIPE, traduzido como "cano 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, já que a maioria dos usuários não quer que o primeiro processo continue rodando e tentando gravar para lugar algum. Enquanto isso, serviços não interativos ignoram o SIGPIPE - não seria bom para um longo executando o daemon para morrer em um erro tão simples - então eles acham o código de erro muito útil.)
No entanto, a entrega de sinal não é 100% imediata, e pode haver casos em que write () retorna EPIPE e o processo continua a funcionar por um curto período antes de receber o sinal. Nesse caso, type
tem tempo suficiente para perceber a falha na gravação, traduzir o código de erro e até mesmo imprimir uma mensagem de erro para 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, já que o processo type
e o código de entrega do sinal do kernel podem ser executados em diferentes núcleos, literalmente ao mesmo tempo.
Seria possível remover esta mensagem remendando o type
builtin (no código-fonte do bash) para sair imediatamente quando receber um EPIPE da função write ().
No entanto, não é nada para se preocupar, e não está relacionado à sua instalação rvm
de qualquer forma.