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

11

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

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

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

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

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

Томас Веллер
источник
1
Это похоже на простую опечатку. Более интересный вопрос - это различия между ()и {}.
edwinksl
связанные unix.stackexchange.com/q/187145/68757
Heemayl

Ответы:

27

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

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

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

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

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

$ echo }
}

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

{ command1; command2 }

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

{ command1; command2; }

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

Обратите внимание, что следующие значения равны x10, но этот параметр забыт до выполнения 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:

(список)

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

{список; }

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

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

John1024
источник