командний рядок - яка мета &&
?
У оболонці, коли бачиш
$ command one && command two
намір полягає в тому, щоб виконати команду, яка слідує за &&
єдиною, якщо перша команда успішна. Це ідіоматично для оболонок Посікса, і не тільки вони знайдені в Баші.
Він має намір запобігти запуску другого процесу, якщо перший не вдався.
Ви можете помітити, що я вжив слово "намір" - це з поважних причин. Не всі програми мають однакову поведінку, тому для цього потрібно зрозуміти, що програма вважає "провалом" і як вона справляється з нею, прочитавши документацію та, якщо необхідно, вихідний код.
Ваша оболонка вважає повернене значення 0 істинним, інші додатні числа - хибними
Програми повертають сигнал про вихід. Вони повинні повернути 0, якщо вони успішно вийдуть, або більший за нуль, якщо цього не зробити. Це дозволяє обмежити кількість зв'язку між процесами.
&&
Згадуються як AND_IF
в граматиці POSIX оболонки , яка є частиною and_or
списку команд, які також включають в себе, ||
який є OR_IF
з подібною семантикою.
Граматичні символи, цитовані з документації:
%token AND_IF OR_IF DSEMI
/* '&&' '||' ';;' */
І Граматика (також цитується з документації), яка показує, що будь-яку кількість AND_IF
s ( &&
) та / або OR_IF
s ( ||
) можна з'єднати (як and_or
визначено рекурсивно):
and_or : pipeline
| and_or AND_IF linebreak pipeline
| and_or OR_IF linebreak pipeline
Обидва оператори мають однаковий пріоритет і оцінюються зліва направо (вони ліво-асоціативні). Як кажуть документи:
AND-OR
Список являє собою послідовність з одного або декількох конвеєрів , розділених операторами "&&"
і "||"
.
Список являє собою послідовність з одного або декількох І-АБО - листи відокремлені один від операторів ';'
і '&'
і необов'язково припинено ';'
, '&'
або.
Оператори "&&"
і "||"
мають однаковий пріоритет і повинні бути оцінені з левоассоціатівностью. Наприклад, обидві наступні команди записують виключно бар на стандартний вихід:
$ false && echo foo || echo bar
$ true || echo foo && echo bar
У першому випадку false - це команда, яка закінчується зі статусом 1
$ false
$ echo $?
1
що означає, echo foo
що не працює (тобто короткочасне керуванняecho foo
). Потім команда echo bar
виконується.
У другому випадку істинний вихід із кодом 0
$ true
$ echo $?
0
і тому echo foo
не виконується, тоді echo bar
виконується.
false && echo "Will not be printed"
.