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

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

cmd1; cmd2 cmd1 && cmd2 

  • Как запускать несколько команд ssh параллельно и хранить выходные данные в переменных
  • Можно ли настроить конфигурацию git через несколько репозиториев?
  • Bash - нет такого файла или каталога, даже если каталог существует и предыдущие команды выполняются правильно
  • Разница в выходе из сценария оболочки
  • Как работает cat> file << "END"?
  • Не удается получить доступ к внешнему жесткому диску.
  • Две трубы для одной команды
  • &> перенаправление не работает правильно
  • 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 или нет.

    Interesting Posts

    Есть ли способ разместить комментарии в файле rsync -files-from?

    Запуск команды после подключения моего клиента OpenVPN

    Как заменить путь в файле новым путем с помощью sed?

    ./Telegram :error при загрузке разделяемых библиотек

    Какие фрагменты несовместимы в массиве Linux md?

    Запустите tomcat при запуске с правами администратора

    (EE) EQ переполнен -> заморозить

    используя Set uid для запуска корневой команды от пользователя без полномочий root

    Как переименовать файлы с sed и csv

    Не удалось выполнить winscp png-файлы

    iptables предотвращает использование ssh для экземпляра aws ec2

    Можно ли использовать virtfs / 9p для совместного использования одной и той же главной папки с несколькими гостями?

    Как исправить ошибку, когда 2 из 3 пользователей в chrooted сети не могут получить доступ на запись?

    Как переключить Arc Linux на lts ядра?

    Некоторое программное обеспечение работает только от корневого терминала

    Linux и Unix - лучшая ОС в мире.