командная строка - какова цель &&
?
В раковине, когда вы видите
$ command one && command two
Цель состоит в том, чтобы выполнить команду, которая следует &&
только в том случае, если первая команда выполнена успешно. Это идиоматично для оболочек Posix, а не только в Bash.
Он намерен предотвратить запуск второго процесса в случае сбоя первого.
Вы можете заметить, что я использовал слово «намерение» - это не зря. Не все программы имеют одинаковое поведение, поэтому для того, чтобы это работало, вы должны понимать, что программа считает «неудачей» и как она ее обрабатывает, читая документацию и, при необходимости, исходный код.
Ваша оболочка считает возвращаемое значение 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
выполняется.
Во втором случае true выходит с кодом 0
$ true
$ echo $?
0
и, следовательно echo foo
, не выполняется, то echo bar
выполняется.
false && echo "Will not be printed"
.