В bash
, Я иногда хочу выполнить несколько команд в сериале и не хочу ожидать их для окончания, прежде чем я введу новые. Таким образом, я делаю что-то вроде этого:
cmd1; cmd2; cmd3
К сожалению, одна из команд могла бы перестать работать. В этом случае я хотел бы остановиться. Существует ли простой способ сделать это, но сделать его так, чтобы я только продолжал управлять командами, если предыдущая команда имела 0 кодов выхода?
Использовать &&
оператор,
cmd1 && cmd2 && cmd3
В shellscripting, &&
и ||
операторы смоделированы после оптимизированной реализации логических операторов в C. &&
операция И средств, и ||
средства ИЛИ. Unix плотно связан с C, и в C, второй операнд логических операторов не оценен, если результат уже известен от первого операнда. Например. "false && x"
false
для любого x
, таким образом, нет никакой потребности оценить x
(особенно, если x
вызов функции); так же для "true || x"
. Это также называют, закорачивая семантику.
И в Unix, традиционно интерпретировать возвращаемые значения команд как "успешное завершение" значения истинности: средства кода выхода 0 true
(успех), ненулевые средства false
(отказ). Так, когда первая команда в cmd1 && cmd2
возвраты "false"
(ненулевой статус выхода, который указывает на отказ), состояние составной команды известно: отказ. Таким образом, полная интерпретация cmd1 && cmd2
может быть: "выполнитесь cmd1
, И ЗАТЕМ если это не перестало работать, cmd2
". Который является тем, что Вы в основном хотите в своем вопросе.
Так же с ИЛИ: cmd1 || cmd2
может быть интерпретирован, поскольку "выполняются cmd1
, ИЛИ ЕСЛИ это перестало работать, cmd2
".
Проподсказка: для более длинных цепочек &&
, рассмотрите помещение set -e
в Вашем сценарии. Это в основном изменяет точку с запятой ;
в &&
, с несколькими особыми случаями.