Estou confuso sobre o porquê "| true ”em um makefile tem o mesmo efeito que“ || verdade"

13

Eu tenho um makefile em que paro um serviço antes de remover um arquivo. Quando não conseguia parar o serviço, o erro seria interrompido. Isso é claramente indesejado, então pensei em adicionar, || truemas perdi a |. Fazendo isto:

stop service foo | true
rm /etc/init/foo.conf

Estou confuso sobre por que isso está funcionando e o que está acontecendo. Isso significa que trueé um aplicativo e não apenas uma palavra-chave? Eles são os mesmos? Existe um bom motivo para usar | true?

Kit Sunde
fonte

Respostas:

16

truee falsesão coreutils (também normalmente embutidos no shell) que retornam apenas 0 e não 0, para situações em que você precisa desse comportamento. Nas páginas do manual:

verdadeiro - não faça nada, com sucesso
falso - não faça nada, sem sucesso

Então você está canalizando a saída para stop service foodentro true, o que a ignora e retorna 0. Tecnicamente funciona, mas você provavelmente deve usar || truepara que fique óbvio qual era sua intenção; não há realmente nenhuma razão para canalizar a saída para um programa que não a está usando

Michael Mrozek
fonte
4
Faz todo o sentido. :) Não sei por que, mas ler "não faça nada sem sucesso". me faz rir.
precisa
9
Outro motivo para evitar | trueé que, se o comando produzisse saída suficiente para preencher o buffer do pipe, ele bloqueava a espera de truelê-lo.
Cjm
3
@cjm ou morra devido a SIGPIPE #
Andy /
6
@Kit: Observe que foo || truee foo | truenão fará a mesma coisa: foo || truemostrará a saída de foo, enquanto foo | truedescartará tudo que estiver foogravado em sua saída padrão (e fooprovavelmente morrerá com SIGPIPEou bloqueará, como já indicado).
Gilles 'SO- stop be evil'
Esta resposta é perfeita, exceto pela palavra "provavelmente" ...!
Sam Watkins