Я розгублений, чому "| true "у makefile має такий самий ефект, як" || правда »


13

У мене є makefile, де я зупиняю службу перед тим, як видалити файл. Якщо не вдалося зупинити послугу, вона помилиться. Це явно небажано, тому я думав, що додам, || trueале пропустив |. Виготовлення:

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

Я розгублений, чому це працює і що відбувається. Чи означає це, що trueце програма, а не просто ключове слово? Вони однакові? Чи є вагомі причини використовувати | true?

Відповіді:


16

trueі falseє coreutils (також типово вбудованими оболонками), які просто повертають 0 та non-0 для ситуацій, коли вам трапляється така поведінка. З чоловічої сторінки:

правда - нічого не робити, успішно
помилково - нічого не робити, безуспішно

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


4
Має ідеальний сенс. :) Я не знаю чому, але читаючи "нічого не робити, безуспішно". змушує мене сміятися.
Kit Sunde

9
Ще одна причина, яку слід уникати, | trueце те, що якщо команда створила достатній вихід для заповнення буфера труби, вона заблокувала б очікування trueїї читання.
cjm

3
@cjm або помре через SIGPIPE
Енді,

6
@Kit: Зверніть увагу , що foo || trueі foo | trueне робитиме те ж саме: foo || trueпокаже вихід із foo, в той час як foo | trueбуде відкидати все , fooпише в стандартний висновок (і foo, ймовірно, померти SIGPIPEабо блок, як вже було зазначено).
Жил "ТАК - перестань бути злим"

Ця відповідь ідеальна за винятком слова "напевно" ...!
Сем Уоткінс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.