Использование паренов помещает команды в подоболочку, что не всегда то, что вы хотите. Или используйте фигурные скобки:
command && echo "Ok, continuing" || { echo "Check internet connection"; exit 1; }
Хитрость заключается в том, что, в отличие от паренов, после команды должна следовать заключительная команда в фигурных скобках ;
.
Почему точка с запятой или новая строка требуется
Фигурная скобка является действительным аргументом для команды. Например, вот фигурная скобка в качестве аргумента для 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
:
(список)
Список выполняется в среде оболочки (см. ниже КОМАНДА ИСПОЛНИТЕЛЬНОЙ СРЕДЫ). Переменные и встроенные команды, которые влияют на среду оболочки, не остаются в силе после ее завершения. Статус возврата - это статус выхода из списка.
{список; }
Список просто выполняется в текущей среде оболочки. список должен заканчиваться символом новой строки или точкой с запятой. Это называется групповой командой. Статус возврата - это статус выхода из списка. Обратите внимание, что в отличие от метасимволов (и), {и} являются зарезервированными словами и должны встречаться там, где зарезервированное слово разрешено распознавать. Поскольку они не вызывают разрыв слова, они должны быть отделены от списка пробелом или другим метасимволом оболочки.
[Акцент добавлен]
()
и{}
.