如果命令失败,如何退出?
我是shell脚本的noob。 如果命令失败,我想打印一条消息并退出我的脚本。 我试过了:
my_command && (echo 'my_command failed; exit)
但它不起作用。 它继续执行脚本中此行后面的指令。 我使用Ubuntu和bash。
尝试:
my_command || { echo 'my_command failed' ; exit 1; }
四个变化:
- 将
&&
更改为||
- 使用
{ }
代替( )
- 介绍
;
exit
后 -
{
之前和之后的空格
既然你想打印消息,并且只有在命令失败时退出(以非零值退出),你需要一个||
不是&&
。
cmd1 && cmd2
将在cmd1
成功时运行cmd2
(退出值0
)。 在哪里
cmd1 || cmd2
将在cmd1
失败(退出值非零)时运行cmd2
。
使用( )
使得它们内部的命令在子shell中运行,并从那里调用一个exit
会导致你退出子shell而不是原来的shell,因此在你的原始shell中继续执行。
为了克服这个使用{ }
最后两个更改是由bash所要求的。
其他答案已经涵盖了直接的问题,但是您也可能对使用set -e
感兴趣。 因此,任何失败的命令(除了特定的上下文之外, if
testing)都将导致脚本中止。 对于某些脚本,这是非常有用的。
另请注意,每个命令的退出状态都存储在shellvariables$?中,您可以在运行该命令后立即检查该variables。 非零状态表示失败:
my_command if [ $? -eq 0 ] then echo "it worked" else echo "it failed" fi
如果你想要脚本中的所有命令的行为,只需添加
set -e set -o pipefail
在剧本的开始。 这一对选项告诉bash解释器每当命令返回一个非零的退出代码就退出。
尽pipe如此,这不允许您输出退出消息。
我捣毁了下面的习语:
echo "Generating from IDL..." idlj -fclient -td java/src echo.idl if [ $? -ne 0 ]; then { echo "Failed, aborting." ; exit 1; } fi echo "Compiling classes..." javac *java if [ $? -ne 0 ]; then { echo "Failed, aborting." ; exit 1; } fi echo "Done."
在每个命令前加一个内容丰富的回声,然后按照每一个命令
if [ $? -ne 0 ];...
if [ $? -ne 0 ];...
行。 (当然,如果你愿意,你可以编辑这个错误信息。)
提供的my_command
是正则devise的, 即成功返回0,那么&&
正好与你想要的相反。 你想||
。
另外请注意(
在bash中我看起来并不正确,但我不能从我的位置去尝试,告诉我。
my_command || { echo 'my_command failed' ; exit 1; }