我在编写shell脚本方面是个新手。如果命令失败,我想打印一条消息并退出脚本。我试过了:
my_command && (echo 'my_command failed; exit)
但这并不奏效。它继续执行脚本中这一行之后的指令。我使用Ubuntu和bash。
我在编写shell脚本方面是个新手。如果命令失败,我想打印一条消息并退出脚本。我试过了:
my_command && (echo 'my_command failed; exit)
但这并不奏效。它继续执行脚本中这一行之后的指令。我使用Ubuntu和bash。
当前回答
其他答案已经很好地涵盖了直接问题,但您可能也对使用set -e感兴趣。因此,任何失败的命令(在特定上下文之外,如if测试)都将导致脚本中止。对于某些脚本,它非常有用。
其他回答
其他答案已经很好地涵盖了直接问题,但您可能也对使用set -e感兴趣。因此,任何失败的命令(在特定上下文之外,如if测试)都将导致脚本中止。对于某些脚本,它非常有用。
如果my_command是规范设计的,ie成功时返回0,那么&&与你想要的完全相反。你要||。
还要注意,(在bash中对我来说似乎不正确,但我不能从我所在的位置尝试。告诉我。
my_command || {
echo 'my_command failed' ;
exit 1;
}
内置的trap shell允许捕获信号和其他有用的条件,包括失败的命令执行(即非零返回状态)。因此,如果你不想显式地测试每个命令的返回状态,你可以输入“你的shell代码”ERR,当命令返回非零状态时,shell代码将被执行。例如:
返回脚本失败;exit 1" ERR
注意,与捕获失败命令的其他情况一样,管道需要特殊处理;上面不会捕获false | true。
如果您希望脚本中的所有命令都具有这种行为,只需添加
set -e
set -o pipefail
在脚本的开头。这对选项告诉bash解释器,当命令返回非零退出码时,就退出。(更多关于为什么需要pipefail的详细信息,请参见http://petereisentraut.blogspot.com/2010/11/pipefail.html)
但是,这并不允许您打印退出消息。
你也可以使用,如果你想保留退出错误状态,并有一个可读的文件,每行一个命令:
my_command1 || exit
my_command2 || exit
但是,这将不会打印任何额外的错误消息。但在某些情况下,失败的命令仍然会打印错误。