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

7

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

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

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

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

, который выходит только в том случае, если нет подключения к Интернету.

    
задан Thomas Weller 28.08.2016 в 21:33
источник

1 ответ

20

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

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

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

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

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

$ echo }
}

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

{ command1; command2 }

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

{ command1; command2; }

Подсели и разница между {...} и (...)

Обратите внимание, что следующие команды x to 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 :

  

(список)

     

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

     

{list; }      

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

     

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

    
ответ дан John1024 28.08.2016 в 21:37
источник

Ознакомьтесь с другими вопросами по меткам