Составные команды в bash

Внимательность с несколькими и составными командами

Команда exit в этом однострочнике выполнится в любом случае:

cd /tmp || echo "cd to /tmp failed." ; exit

Ибо это тоже самое, что и:

cd /tmp || echo "cd to /tmp failed."
exit

Если же хочется выполнить exit, если cd завершится с ошибкой, нужно:

cd /tmp || { echo "cd to /tmp failed." ; exit; }

Составные команды

Фигурные скобки в последнем выражении используются для определения составных команд (группировки инструкций).
Есть еще что-то подобное с круглыми скобками, но инструкции внутри них выполняются в подоболочке (дочерний процесс). В последнем примере при использовании круглых скобок выход по команде exit произойдет из подоболочки, что не даст желаемого результата.

Завершать составные команды нужно точкой с запятой (;) или переводом строки перед закрывающей фигурной скобкой. Естественно, содержимое составных команд должно отделяться от фигурных скобок пробелами.

cd /tmp || { echo "cd to /tmp failed." ; exit; }
# или
cd /tmp || {
	echo "cd to /tmp failed."
	exit
}

Еще пару наглядных примеров:

echo 1 && echo 2 || echo 3
1
2
echo 1 || echo 2 && echo 3
1
3

Всё потому, что в bash операторы && и || имеют одинаковый приоритет и являются левоассоциативными (вычисление выражения слева направо).


Соус: Книга “Идиомы Bash Глава 2. “Идиома большого if

bash