Составные команды в 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"