Як ланцюжок команд на консолі?


23

В bashінколи я хочу запускати кілька команд послідовно, і не хочу чекати, коли вони закінчаться, перш ніж набрати нові. Тож я роблю щось подібне:

cmd1; cmd2; cmd3

На жаль, одна з команд може вийти з ладу. У такому випадку я хотів би зупинитися. Чи є простий спосіб це зробити, але зробіть так, щоб я продовжував виконувати команди, лише якщо попередня команда мала вихідний код 0?


Відповіді:


39

Використовувати &&оператор,

cmd1 && cmd2 && cmd3

У оболонках &&та ||операторах моделюються після оптимізованої реалізації логічних операторів у C. &&означає оператор AND і ||означає OR. 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свій сценарій. Це в основному змінює крапку з комою ;на &&кілька спеціальних випадків.


1
+1 для пояснення||
Альп

чи можете ви прив'язати ланцюжок незалежно від статусу першої команди? (успіх чи невдача)
Hugo Trentesaux

@HugoTrentesaux, що ти маєш на увазі? .. Результат успіху / невдачі або A || Bтакий же, як логічний A або B [коротке замикання] . A || Bє успіх, коли Aбув успіх , або коли Aбув невдачею, але Bбув успіхом ; і A || Bє невдача, коли Aбула невдача і Bбула failure. Аналогічно для &&цього випливає логічний І.
улідко

Як в контексті оболонки я можу виконати A, а потім B, незалежно від того, невдало чи вдалося A?
Хьюго Трентсо

1
@HugoTrentesaux це те, що звичайний звичайний ;(або новий рядок) робить за замовчуванням. set -eперетвориться ;на &&, грубо кажучи. set +e[за замовчуванням] перетворюється A; Bна те, що ви говорите: біжіть A, то неважливо - який біг B.
ulidtko

13

"Кодування команд групуванням їх"

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

pings, лише якщо це не вдалося, виконує ланцюгову групу команд у дужках.

Увага:

Список повинен бути припинений символом ";".

Між дужками та згрупованими командами повинні бути порожні пробіли!


6

Просто з &&оператором. Наприклад:

cmd1 && cmd2 && cmd3

Якщо одна з команд виходить з ладу (повертає значення виходу, відмінне від 0), інші команди не запускаються.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.