Выполните две команды в случае || или &&

Я читал о && и ||, и я хотел бы выполнить две команды в ложном случае.

Я попробовал ; но это работает всегда. Я попытался поместить его в фигурные скобки { command1; command2 } но это приводит к синтаксической ошибке.

Я хочу сделать что-то как

command && echo "Ok, continuing" || echo "Check internet connection"; exit 1

из которого только выходят, если нет никакого Интернет-соединения.

9
задан 23 May 2017 в 05:39

1 ответ

Используя parens помещает команды в подоболочку, которая является не всегда, что Вы хотите. С другой стороны, используйте фигурные скобки:

command && echo "Ok, continuing" || { echo "Check internet connection"; exit 1; }

Прием здесь - то, что, в отличие от parens, заключительная команда в фигурных скобках должна сопровождаться ;.

Почему точка с запятой или новая строка требуются

Изогнутая фигурная скобка является допустимым аргументом команде. Например, вот изогнутая фигурная скобка как аргумент echo:

$ echo }
}

Следовательно, если оболочка видит:

{ command1; command2 }

Оболочка интерпретирует command1 как имеющий аргументы и command2 как наличие одного аргумента, состоящего из символа }. Изогнутая фигурная скобка } только интерпретируется как закрытие группировки, если оно следует за точкой с запятой или новой строкой. Сделать вышеупомянутую работу:

{ command1; command2; }

Подоболочки и различие между {...} и (...)

Заметьте что следующие наборы x к 10, но что о той установке забывают перед echo выполнения команды:

$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0

С фигурными скобками, в отличие от этого, установкой x=10 помнится:

$ x=0; false || { echo Hello; x=10; }
Hello
$ echo $x
10

Различие - то, потому что переменные присвоения в подоболочке не выживают после того, как подоболочка завершается.

Документация

От man bash:

(список)

список выполняется в подсреде оболочки (см. СРЕДУ ВЫПОЛНЕНИЯ КОМАНДЫ ниже). Переменные присвоения и встроенные команды, которые влияют на среду оболочки, не остаются в силе после того, как команда завершается. Статус возврата является статусом выхода списка.

{список;}

список просто выполняется в текущей среде оболочки. список должен быть завершен с новой строкой или точкой с запятой. Это известно как команда группы. Статус возврата является статусом выхода списка. Обратите внимание, что в отличие от метасимволов (и), {и} зарезервированные слова и должны произойти, где зарезервированному слову разрешают быть распознанным. Так как они не вызывают разрыв слова, они должны быть разделены от списка пробелом или другим метасимволом оболочки.

[Акцент, добавленный]

24
ответ дан 23 November 2019 в 04:47

Другие вопросы по тегам:

Похожие вопросы: