Ответ 1
&&
позволяет вам сделать что-то, основанное на успешной успешной работе предыдущей команды, - поэтому вы склонны видеть ее цепью как do_something && do_something_else_that_depended_on_something
.
Насколько я знаю, с помощью &
после запуска команды в фоновом режиме.
Пример использования &
: tar -czf file.tar.gz dirname &
Но как насчет &&
? (посмотрите на этот пример: https://serverfault.com/info/215179/centos-100-disk-full-how-to-remove-log-files-history-etc#answer-215188)
&&
позволяет вам сделать что-то, основанное на успешной успешной работе предыдущей команды, - поэтому вы склонны видеть ее цепью как do_something && do_something_else_that_depended_on_something
.
Кроме того, у вас также есть ||
что является логическим или, а также ;
это просто разделитель, который не заботится о том, что случилось с командой раньше.
$ false || echo "Oops, fail"
Oops, fail
$ true || echo "Will not be printed"
$
$ true && echo "Things went well"
Things went well
$ false && echo "Will not be printed"
$
$ false ; echo "This will always run"
This will always run
Некоторые подробности об этом можно найти здесь. Списки команд в руководстве по Bash.
командная строка - какова цель
&&
?
В раковине, когда вы видите
$ command one && command two
намерение состоит в том, чтобы выполнить команду, которая следует за &&
только если первая команда успешна. Это идиоматично для оболочек Posix, а не только в Bash.
Он намерен предотвратить запуск второго процесса в случае сбоя первого.
Программы возвращают сигнал при выходе. Они должны возвращать 0, если они успешно завершены, или больше нуля, если они этого не делают. Это позволяет ограниченное количество связи между процессами.
&&
упоминается как AND_IF
в грамматике оболочки posix, которая является частью списка команд and_or
, который также включает в себя ||
который является OR_IF
с похожей семантикой.
Грамматические символы:
%token AND_IF OR_IF DSEMI /* '&&' '||' ';;' */
Грамматика:
and_or : pipeline | and_or AND_IF linebreak pipeline | and_or OR_IF linebreak pipeline
Оба оператора имеют одинаковый приоритет и оцениваются слева направо (они являются ассоциативными слева). Например, следующее:
$ false && echo foo || echo bar $ true || echo foo && echo bar
оба эхо только bar
.
В первом случае false - это команда, которая выходит со статусом 1
$ false
$ echo $?
1
что означает, что echo foo
не запускается (т.е. короткое замыкание echo foo
). Затем команда echo bar
выполняется.
Во втором случае true выходит с кодом 0
$ true
$ echo $?
0
и, следовательно, echo foo
не выполняется, тогда echo bar
выполняется.
Довольно распространенное использование для '& &' компилирует программное обеспечение с помощью autotools. Например:
./configure --prefix=/usr && make && sudo make install
В принципе, если конфигурация завершается успешно, make запускается для компиляции, и если это удается, make выполняется от root для установки программы. Я использую это, когда я в основном уверен, что все будет работать, и это позволяет мне делать другие важные вещи, такие как смотреть на stackoverflow, а не "отслеживать" прогресс.
Иногда я действительно увлекаюсь...
tar xf package.tar.gz && ( cd package; ./configure && make && sudo make install ) && rm package -rf
Я делаю это, когда, например, создаю linux с нуля.
&&
объединяет команды. Последовательные команды выполняются только в том случае, если предыдущие выполняются.
Аналогично, ||
позволит выполнить последовательную команду, если предыдущее не выполнено.
См. пример:
mkdir test && echo "Something" > test/file
Shell попытается создать каталог test
, а затем , только если он был успешно, попробуйте создать файл внутри него.
Таким образом, вы можете прервать последовательность шагов, если один из них потерпел неудачу.
command_1 && command_2
: выполнить команду_2 только тогда, когда команда_ успешно выполнена.
command_1 || command_2
: выполнить команду_2 только тогда, когда команда_1 не выполнена успешно.
Похоже, как условие "если" выполняется на основном языке программирования, например, в if (condition_1 && condition_2){...}
условие_2 будет опущено, если условие_1 равно false
, а в if (condition_1 || condition_2){...}
условие_2 будет опущено, если условие_1 равно true
.
Смотрите, это тот же трюк, который вы используете для кодирования:)
Он должен выполнить второй оператор, если первый оператор завершится успешно. Как оператор if:
if (1 == 1 && 2 == 2)
echo "test;"
Сначала он пытается, если 1 == 1, если это правда, он проверяет, 2 == 2