如何在bash中退出带有错误消息和错误代码的程序?

时间:2015-11-18 15:49:16

标签: bash error-handling

我想在无法执行操作时退出脚本。

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."
  • 如何在bash中退出带有错误消息的程序?
  • 为什么ls || echo "Having trouble" && exit 1;退出?

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&&回音栏