Команда 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 312
echo 1 || echo 2 && echo 313
Всё потому, что в bash операторы && и || имеют одинаковый приоритет и являются левоассоциативными (вычисление выражения слева направо).
Соус: Книга Идиомы Bash→ Глава 2. Идиома большого if