Я не понимаю, почему «| true »в make-файле имеет тот же эффект, что и« || правда"

13

У меня есть make-файл, где я останавливаю службу перед удалением файла. Когда это не могло остановить обслуживание, это сломалось бы по ошибке. Это явно нежелательно, поэтому я решил добавить, || trueно пропустил |. Делая это:

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

Я не понимаю, почему это работает и что происходит. Означает ли это, что trueэто приложение, а не просто ключевое слово? Они одинаковы? Есть ли хорошая причина для использования | true?

Кит Сунде
источник

Ответы:

16

trueи falseявляется Coreutils (также , как правило , оболочка встроенных модулей) , которые просто возвращают 0 и не-0, в ситуации , когда случаются, нужно это поведение. Из справочных страниц:

true - ничего не делать, успешно
false - ничего не делать, безуспешно

Таким образом, вы отправляете вывод из stop service fooв true, который игнорирует его и возвращает 0. Технически это работает, но вам, вероятно, следует использовать, || trueчтобы было очевидно, каково было ваше намерение; нет никакой причины направлять вывод в программу, которая его не использует

Михаил Мрозек
источник
4
Имеет смысл. :) Я не знаю почему, но читаю "ничего не делать, безуспешно". Смешит.
Кит Сунд
9
Другая причина, по которой следует избегать, | trueзаключается в том, что если команда выдаст достаточно выходных данных для заполнения буфера канала, она заблокирует ожидание trueее чтения.
CJM
3
@cjm или умри из-за SIGPIPE
Энди
6
@Kit: Обратите внимание, что foo || trueи foo | trueне будет делать то же самое: foo || trueпокажет вывод из foo, в то время как foo | trueбудет отбрасывать все fooзаписи в свой стандартный вывод (и foo, скорее всего, умрет SIGPIPEили заблокировать, как уже указано).
Жиль "ТАК - перестань быть злым"
Этот ответ идеально подходит, за исключением слова "вероятно" ...!
Сэм Уоткинс