23

В bash я иногда хочу запустить несколько команд последовательно и не хочу ждать, пока они завершатся, прежде чем я наберу новые. Поэтому я делаю что-то вроде этого:

cmd1; cmd2; cmd3

К сожалению, одна из команд может потерпеть неудачу. В таком случае я бы хотел остановиться. Есть ли простой способ сделать это, но сделать так, чтобы я продолжал выполнять команды, только если предыдущая команда имела код выхода 0?

3 ответа3

38

Используйте && оператор,

cmd1 && cmd2 && cmd3

В скорлупе, && и || операторы моделируются после оптимизированной реализации логических операторов в C. && означает оператор AND, а || означает ИЛИ. Unix тесно связан с C, а в C второй операнд логических операторов не оценивается, если результат уже известен из первого операнда. Например, "false && x" является false для любого x , поэтому нет необходимости оценивать x (особенно, если x является некоторым сложным логическим выражением); аналогично для "true || x" . Это также называется семантикой короткого замыкания .

А в Unix традиционно интерпретировать возвращаемые значения команд как true значения "успешного завершения": код выхода 0 означает истину (успех), ненулевой - false (сбой). Таким образом, когда первая команда в cmd1 && cmd2 возвращает значение "false" (ненулевой статус выхода, который указывает на сбой), статус составной команды известен: сбой. Таким образом, общая интерпретация cmd1 && cmd2 может быть такой: «выполнить cmd1 И ТО, если это не удалось, cmd2 ». Что именно вы хотите в своем вопросе?

Аналогично с OR: cmd1 || cmd2 можно интерпретировать как «выполнить cmd1 , ИЛИ ЕСЛИ не получится , cmd2 ».


Подсказка: для более длинных цепочек && рассмотрите возможность включения set -e в ваш скрипт. Это в основном меняет точку с запятой ; в && , с парой особых случаев.

12

"Цепные команды группируют их"

ping 192.168.0.1 || { echo "ping not successful"; exit 1; }

ping, только если он не успешен, выполняет цепочечную группу команд в скобках.

Внимание:

Список должен заканчиваться символом «;».

Между скобками и сгруппированными командами должны быть пробелы!

6

Просто с оператором && . Например:

cmd1 && cmd2 && cmd3

В случае сбоя одной из команд (возвращает значение выхода, отличное от 0), другие команды не будут выполняться.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .