我想在无法执行操作时退出脚本。
non-existing || exit 1;
工作正常并退出,而
ls || exit 1;
不退出。现在,我还想在退出程序之前添加错误消息。
non-existing || echo "Having trouble" && exit 1;
按预期退出,但
ls || echo "Having trouble" && exit 1;
也会退出,但不应执行echo
命令(以及exit
)。
我首先想到使用括号可能会有所帮助:
ls || (echo "Having trouble" && exit 1;)
不退出。但是当我调用一个不存在的程序时,exit
- 命令只退出我使用括号打开的子shell:
non-existing || (echo "Having trouble" && exit 1;)
echo "Still executed."
ls || echo "Having trouble" && exit 1;
退出?答案 0 :(得分:3)
您可以使用{ ...; }
而不是(...)
来避免子shell以及导致并获得所需结果的问题。
请注意打开{
后的空格和分号/等。并且在结束}
之前的空格是必需的(对于()
,它们是可选的)。
至于为什么ls || echo && exit
没有按照您的预期做出答案,因为||
和&&
运算符具有相同的优先级并且是左关联的(请参阅{{3 }})。
所以当shell看到
时ls || echo "Having trouble" && exit 1;
你认为它是
ls || { echo "Having trouble" && exit 1; }
但shell将其解析为
{ ls || echo "Having trouble"; } && exit 1;
或者,正如规范所说:
运营商“&&”和“||”应具有相同的优先权,并应以左相关性进行评估。例如,以下两个命令都只写入标准输出:
false&& echo foo ||回音栏
true || echo foo&&回音栏