Команды в ( )
выполняются в подоболочке, поэтому exit
внутри скобок выходит только из подоболочки, а не из основной оболочки.Вы можете сгруппировать команды без , заставляя подоболочку, используя { }
вместо скобок.Примечание: в отличие от паренов, вам нужен пробел после {
и точка с запятой (или амперсанд) перед }
.
$ eco a &>/dev/null && echo b || { echo c ; exit 1; } ; echo d ;echo e;echo f output
c
logout
Кроме того, вы должны знать, что использование && ... ||
означает не аналогично if then else fi
структуре;в частности, если команда между &&
и ||
(что соответствует предложению then
в операторе if
) не будет выполнена, она также выполнит то, что следует после ||
.Имея только echo b
, маловероятно (но технически возможно), что он потерпит неудачу;если это сложнее, вы можете получить неожиданные результаты.
В результате я рекомендую использовать if then else fi
вместо && ||
- он правильно обрабатывает группировку без дополнительных хлопот и неочевидные пути выполнения.В отличие от && ||
, он просто работает.