Je ne sais pas pourquoi «| true "dans un makefile a le même effet que" || vrai"

13

J'ai un makefile où j'arrête un service avant de supprimer un fichier. Quand il ne pouvait pas arrêter le service, il se cassait en cas d'erreur. C'est clairement indésirable, j'ai donc pensé ajouter || truemais j'ai raté un |. Faire:

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

Je ne sais pas pourquoi cela fonctionne et ce qui se passe. Est-ce à dire que truec'est une application et pas seulement un mot-clé? Sont-ils les mêmes? Y a-t-il une bonne raison d'utiliser | true?

Kit Sunde
la source

Réponses:

16

trueet falsesont des coreutils (également généralement intégrés au shell) qui renvoient simplement 0 et non 0, pour les situations où vous avez besoin de ce comportement. Depuis les pages de manuel:

vrai - ne rien faire, avec succès
faux - ne rien faire, sans succès

Donc, vous canalisez la sortie de stop service foodans true, qui l'ignore et retourne 0. Techniquement, cela fonctionne, mais vous devriez probablement l'utiliser || true, il est donc évident de savoir quelle était votre intention; il n'y a vraiment aucune raison de diriger la sortie vers un programme qui ne l'utilise pas

Michael Mrozek
la source
4
C'est parfaitement logique. :) Je ne sais pas pourquoi mais lire "ne rien faire, sans succès." me fait rire.
Kit Sunde
9
Une autre raison à éviter | trueest que si la commande produisait suffisamment de sortie pour remplir le tampon de tuyau, elle bloquerait l'attente de truesa lecture.
cjm
3
@cjm ou mourir à cause de SIGPIPE
Andy
6
@Kit: Notez que foo || trueet foo | truene fera pas la même chose: foo || trueaffichera la sortie de foo, tandis que foo | truesupprimera tout ce qui est fooécrit sur sa sortie standard (et foorisque de mourir avec SIGPIPEou de bloquer, comme déjà indiqué).
Gilles 'SO- arrête d'être méchant'
Cette réponse est parfaite sauf pour le mot "probablement" ...!
Sam Watkins