Ich bin verwirrt, warum “| true “in einem Makefile hat den gleichen Effekt wie„ || wahr"

13

Ich habe ein Makefile, in dem ich einen Dienst stoppe, bevor ich eine Datei entferne. Wenn der Dienst nicht beendet werden konnte, brach er bei einem Fehler ab. Dies ist eindeutig unerwünscht, also dachte ich, ich würde hinzufügen, habe || trueaber eine verpasst |. Ich mach das:

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

Ich bin verwirrt, warum dies funktioniert und was passiert. Bedeutet dies, dass truees sich um eine Anwendung und nicht nur um ein Schlüsselwort handelt? Sind sie gleich Gibt es einen guten Grund dafür | true?

Kit Sunde
quelle

Antworten:

16

trueund falsesind Coreutils (normalerweise auch Shell-Built-Ins), die nur 0 und Nicht-0 zurückgeben, für Situationen, in denen Sie dieses Verhalten benötigen. Aus den Manpages:

wahr - nichts tun, erfolgreich
falsch - nichts tun, erfolglos

Sie leiten also die Ausgabe von stop service foonach true, was sie ignoriert und 0 zurückgibt. Technisch funktioniert es, aber Sie sollten es wahrscheinlich verwenden, || truedamit klar ist, was Ihre Absicht war. Es gibt wirklich keinen Grund, die Ausgabe in ein Programm umzuleiten, das sie nicht verwendet

Michael Mrozek
quelle
4
Macht perfekt Sinn. :) Ich weiß nicht warum, lese aber "Nichts tun, erfolglos." bringt mich zum Lachen.
Kit Sunde
9
Ein weiterer Grund, dies zu vermeiden, | truebesteht darin, dass das Warten auf truedas Lesen des Pipe-Puffers blockiert wird, wenn der Befehl genügend Ausgabe erzeugt, um den Pipe-Puffer zu füllen .
cjm
3
@ CJM oder sterben aufgrund von Sigpipe
Andy
6
@Kit: Beachten Sie, dass foo || trueund foo | truewird die gleiche Sache nicht tun: foo || truedie Ausgabe von zeigen foo, während foo | truealles verwerfen fooSchreiben in der Standardausgabe (und foowahrscheinlich mit sterben SIGPIPEoder zu blockieren, wie bereits angedeutet).
Gilles 'SO- hör auf böse zu sein'
Diese Antwort ist perfekt bis auf das Wort "wahrscheinlich" ...!
Sam Watkins