В чем разница между «&&» и «;», когда команды цепочки

В чем разница между следующими способами цепочки команд?

cmd1; cmd2 cmd1 && cmd2 

4 Solutions collect form web for “В чем разница между «&&» и «;», когда команды цепочки”

Предположим, что есть command1 && command2 .

В этом случае command2 будет выполняться, если и только если command1 возвратил нулевой статус выхода.

; это просто разделитель команд. Таким образом, command2 будет выполнена независимо от возвращаемой команды.

 $> [[ "a" = "b" ]] && echo ok $> [[ "a" = "b" ]]; echo ok ok 

cmd1; cmd2 cmd1; cmd2 выполняет cmd1 , затем cmd2 , независимо от того, что. Это точно эквивалентно размещению cmd1 и cmd2 на отдельных строках¹. Возвращаемым статусом этой составной команды является команда cmd2 .

cmd1 && cmd2 выполняет cmd1 . Затем, если статус выхода cmd1 равен нулю, cmd2 . Возвращаемым статусом этой составной команды является команда cmd1 если она отлична от нуля (так что cmd2 не запускался), а cmd2 противном случае (если он выполнялся).

if cmd1; then cmd2; fi if cmd1; then cmd2; fi в основном эквивалентен cmd1 && cmd2 . Основное различие заключается в том, что версия с if возвращает 0, если cmd1 возвращает ненулевой статус.

Команда возвращает 0, чтобы указать успех, и ненулевой код ошибки (между 1 и 255, обычно между 1 и 125, как более высокие значения, имеют другие значения), чтобы указать на отказ. Таким образом, cmd1; cmd2 cmd1; cmd2 означает «выполнять эти команды в последовательности независимо от того, что», тогда как cmd1 && cmd2 означает «выполнить эти команды, но немедленно прекратите работу, если первая команда cmd1 && cmd2 неудачей».

Вы можете указать оболочке войти в режим «выйти в ошибке», запустив set -e . В этом режиме оболочка завершается, как только любая команда возвращает ненулевой статус, за исключением условных конструкций (левая часть && или || , условие – часть if и while ). Таким образом, при set -e (или новая строка) эффективно эквивалентна && ².

¹ В терминах потока управления, то есть. Новые строки и точки с запятой выполняются точно так же, но они не обрабатываются точно так же, например, alias ls=true; ls alias ls=true; ls выполняет ls а не true потому что синтаксический анализатор выполняет разрешение псевдонима на ls прежде чем он выполнит определение псевдонима.
¹ Это не означает, что вы можете слепо заменить && ; если вы добавили set -e . Например ; имеет более низкий приоритет, чем && , поэтому cmd1 && cmd2 || cmd3 cmd1 && cmd2 || cmd3 эквивалентно set -e; { cmd1; cmd2; } || cmd3 set -e; { cmd1; cmd2; } || cmd3 set -e; { cmd1; cmd2; } || cmd3 . Кроме того, set -e плохо взаимодействует с подоболочками – детали могут подорвать этот ответ слишком далеко.

Первая строка будет выполнять одну команду за другой, независимо от того, сменилась ли первая или нет. Вторая строка – пример логики оболочки: она выполнит только вторую команду, если первая удалась. Это связано с тем, что && логично and . Поэтому, если первая команда не выполняется, логическое состояние всей строки, как известно, является ложным, и нет необходимости оценивать вторую команду.

Более практично, есть разница между

 cd /backup/old; rm -rf -- * 

а также

 cd /backup/old && rm -rf -- * 

, Кроме того, это глупо, первый из них удалит всю вашу файловую систему (или $ HOME, в зависимости от того, как она вызвана), потому что она запускает rm независимо от того, преуспел ли cd или нет.

  • Способ интерактивного редактирования некоторого текста из оболочки
  • Как передать переменную скрипту KSH с CGI?
  • Bash - нет такого файла или каталога, даже если каталог существует и предыдущие команды выполняются правильно
  • трубы в командной строке linux
  • Поместите несколько переменных после другой переменной
  • Как команда diff обрабатывает кеширование?
  • Как переключиться с неизвестной оболочки на bash?
  • Как запускать несколько команд ssh параллельно и хранить выходные данные в переменных
  • Удаление файлов с пробелами в именах
  • Что я могу узнать об этой части кода?
  • Можно ли запускать несколько команд mv в одном каталоге (состояние гонки)?
  • Почему «rm -rf ./» ничего не удаляет?
  • Linux и Unix - лучшая ОС в мире.