【问题标题】:How to execute exit command while using && and ||?使用 && 和 || 时如何执行退出命令?
【发布时间】:2018-10-10 05:35:16
【问题描述】:
我有两种情况。
echo a &>/dev/null && echo b || (echo c ; exit 1) ; echo d ;echo e;echo f
输出:
b
d
e
f
echo a &>/dev/null && echo b || (echo c ; exit 1) ; echo d ;echo e;echo f
输出:
c
d
e
f
我需要我的脚本在退出命令后退出,而不是执行进一步的命令。我该怎么做?
【问题讨论】:
标签:
linux
bash
shell
scripting
【解决方案1】:
( ) 中的命令在子 shell 中执行,因此括号内的exit 仅退出子 shell,而不是主 shell。您可以使用{ } 而不是括号对命令进行分组。注意:与括号不同,{ 之后需要一个空格,} 之前需要一个分号(或与号)。
$ eco a &>/dev/null && echo b || { echo c ; exit 1; } ; echo d ;echo e;echo f output
c
logout
另外,您应该知道使用&& ... || 与if then else fi 结构不相同;特别是,如果&& 和|| 之间的命令(对应于if 语句中的then 子句)碰巧失败,它也会执行|| 之后的内容。那里只有echo b,它不太可能(但技术上可能)失败;如果它更复杂,你会得到意想不到的结果。
因此,我建议使用if then else fi 而不是&& ||——它可以正确处理分组而不会带来额外的麻烦,并且没有不明显的执行路径。与&& || 不同,它可以正常工作。
【解决方案2】:
exit 最终会退出子 shell ((...)),而不是调用它的脚本。
见Command grouping。
但是,echo b 以状态 0 退出,所以 || 之后的任何内容都不会被执行。