Jestem zdezorientowany, dlaczego „| true ”w makefile ma taki sam efekt jak„ || prawdziwe"

13

Mam plik makefile, w którym zatrzymuję usługę przed usunięciem pliku. Gdy nie może zatrzymać usługi, zepsuje się przy błędzie. Jest to wyraźnie niepożądane, więc pomyślałem, że dodam, || trueale przegapiłem |. Robić to:

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

Jestem zdezorientowany, dlaczego to działa i co się dzieje. Czy to oznacza, że truejest to aplikacja, a nie tylko słowo kluczowe? Czy oni są tacy sami? Czy istnieje dobry powód do korzystania | true?

Kit Sunde
źródło

Odpowiedzi:

16

truei falsecoreutils (zwykle również wbudowanymi powłokami), które zwracają po prostu 0 i inne niż 0, w sytuacjach, gdy akurat potrzebujesz takiego zachowania. Ze stron podręcznika:

prawda - nic nie rób, pomyślnie
fałsz - nic nie rób bezskutecznie

Więc przesyłasz dane wyjściowe stop service foodo true, który je ignoruje i zwraca 0. Technicznie działa, ale prawdopodobnie powinieneś użyć, || truewięc jest oczywiste, jaki był twój zamiar; naprawdę nie ma powodu, aby przesyłać dane wyjściowe do programu, który go nie używa

Michał Mrożek
źródło
4
Ma sens. :) Nie wiem dlaczego, ale czytam „nic nie rób bezskutecznie”. rozśmiesza mnie.
Kit Sunde
9
Innym powodem, dla którego należy unikać, | truejest to, że jeśli polecenie wygenerowało wystarczającą ilość danych wyjściowych do wypełnienia bufora potoku, blokowałoby oczekiwanie na truejego odczytanie.
cjm
3
@cjm lub zgiń z powodu SIGPIPE
Andy
6
@Kit: Zauważ, że foo || truei foo | truenie zrobię tego samego: foo || truepokaże wyjście z foo, natomiast foo | trueodrzuci wszystko, co foozapisuje na standardowe wyjście (i fooprawdopodobnie umrze z SIGPIPElub zablokuje, jak już wskazano).
Gilles 'SO - przestań być zły'
Ta odpowiedź jest idealna, z wyjątkiem słowa „prawdopodobnie” ...!
Sam Watkins,