В некоторых случаях bash
я хочу запускать несколько команд последовательно и не хочу ждать, пока они завершатся, прежде чем набирать новые. Поэтому я делаю что-то вроде этого:
cmd1; cmd2; cmd3
К сожалению, одна из команд может потерпеть неудачу. В таком случае я бы хотел остановиться. Есть ли простой способ сделать это, но сделать так, чтобы я продолжал выполнять команды, только если предыдущая команда имела код завершения 0?
command-line
bash
питоническая метафора
источник
источник
Ответы:
Используйте
&&
оператор,В shellscripting,
&&
и||
операторы по образцу оптимизированной реализации логических операторов в C.&&
Средства и оператора, а также||
средства ИЛИ. Unix тесно связан с C, а в C второй операнд логических операторов не оценивается, если результат уже известен из первого операнда. Например"false && x"
,false
для любогоx
, поэтому нет необходимости оцениватьx
(особенно, еслиx
это вызов функции); аналогично для"true || x"
. Это также называется семантикой короткого замыкания .А в Unix традиционно интерпретировать возвращаемые значения команд как истинные значения «успешного завершения»: код выхода 0 означает
true
(успех), ненулевое значениеfalse
(сбой). Таким образом, когда первая команда вcmd1 && cmd2
возврате"false"
(ненулевой статус выхода, который указывает на сбой), статус составной команды известен: сбой. Таким образом, общая интерпретацияcmd1 && cmd2
может быть: «выполнитьcmd1
, а затем, если это не сработалоcmd2
». Что именно вы хотите в своем вопросе?Аналогично с OR:
cmd1 || cmd2
можно интерпретировать как «выполнитьcmd1
, ИЛИ если не получитсяcmd2
».Подсказка: для более длинных цепочек
&&
, подумайте над тем , чтобыset -e
вставить свой сценарий. Это в основном меняет точку с запятой;
на&&
пару особых случаев.источник
||
A || B
точно такой же , как [короткое замыкание] логического А или В .A || B
это успех , когдаA
был успех , или когдаA
был провал , ноB
был успех ; иA || B
это провал, когдаA
был провал иB
былfailure
. Аналогично для&&
, следует логическое И.;
(или новая строка ) делает по умолчанию.set -e
превратится;
в&&
, грубо говоря.set +e
[по умолчанию] превращаетсяA; B
в то, что вы говорите: бегиA
, потом неважно, что бегиB
.«Цепные команды группируют их»
ping, только если он не успешен, выполняет цепочечную группу команд в скобках.
Внимание:
Список должен заканчиваться символом «;».
Между скобками и сгруппированными командами должны быть пробелы!
источник
Просто с
&&
оператором. Например:В случае сбоя одной из команд (возвращает значение выхода, отличное от 0), другие команды не будут выполняться.
источник