Estoy confundido sobre por qué "| verdadero "en un archivo MAKE tiene el mismo efecto que" || cierto"

13

Tengo un archivo MAKE donde detengo un servicio antes de eliminar un archivo. Cuando no podía detener el servicio, se rompería por error. Esto es claramente no deseado, así que pensé en agregar, || truepero me perdí un |. Haciendolo:

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

Estoy confundido sobre por qué esto está funcionando y qué está sucediendo. ¿Esto significa que truees una aplicación y no simplemente una palabra clave? ¿Son lo mismo? ¿Hay una buena razón para usar | true?

Kit Sunde
fuente

Respuestas:

16

truey falseson coreutils (también generalmente incorporados en shell) que solo devuelven 0 y no 0, para situaciones en las que usted necesita ese comportamiento. De las páginas del manual:

verdadero - no hacer nada, con éxito
falso - no hacer nada, sin éxito

Entonces, está canalizando la salida desde stop service foodentro true, lo que lo ignora y devuelve 0. Técnicamente funciona, pero probablemente debería usarlo, || truepor lo que es obvio cuál era su intención; realmente no hay razón para canalizar la salida en un programa que no lo está usando

Michael Mrozek
fuente
44
Tiene mucho sentido. :) No sé por qué pero leer "no hacer nada, sin éxito". me hace reir.
Kit Sunde
99
Otra razón para evitar | truees que si el comando produce suficiente salida para llenar el búfer de tubería, bloqueará la espera de trueleerlo.
cjm
3
@cjm o morir debido a SIGPIPE
Andy
66
@Kit: Tenga en cuenta que foo || truey foo | trueno hará lo mismo: foo || truemostrará la salida de foo, mientras foo | trueque descartará todo lo que fooescriba en su salida estándar (y fooes probable que muera SIGPIPEo bloquee, como ya se indicó).
Gilles 'SO- deja de ser malvado'
¡Esta respuesta es perfecta excepto por la palabra "probablemente" ...!
Sam Watkins