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?

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


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.