use*_*246 193 linux bash exit exitstatus
我是shell脚本中的菜鸟.如果命令失败,我想打印一条消息并退出我的脚本.我试过了:
my_command && (echo 'my_command failed; exit)
Run Code Online (Sandbox Code Playgroud)
但它不起作用.它不断执行脚本中此行之后的指令.我正在使用Ubuntu和bash.
cod*_*ict 363
尝试:
my_command || { echo 'my_command failed' ; exit 1; }
Run Code Online (Sandbox Code Playgroud)
四个变化:
&&
到||
{ }
代替( )
;
之后exit
{
之前和之后的空格}
由于您要打印消息并仅在命令失败时退出(退出时为非零值),因此您需要a ||
而不是&&
.
cmd1 && cmd2
Run Code Online (Sandbox Code Playgroud)
成功cmd2
时运行cmd1
(退出值0
).在哪里
cmd1 || cmd2
Run Code Online (Sandbox Code Playgroud)
将cmd2
在cmd1
失败时运行(退出值非零).
使用( )
make命令在子shell中运行并exit
从那里调用a 会导致您退出子shell而不是原始shell,因此在原始shell中继续执行.
克服这种用途 { }
bash需要最后两个更改.
Dae*_*yth 119
其他答案很好地涵盖了直接问题,但您可能也有兴趣使用set -e
.这样,任何失败的命令(在特定上下文之外,如if
测试)都将导致脚本中止.对于某些脚本,它非常有用.
Ale*_*sky 60
另请注意,每个命令的退出状态都存储在shell变量$?中,您可以在运行命令后立即检查.非零状态表示失败:
my_command
if [ $? -eq 0 ]
then
echo "it worked"
else
echo "it failed"
fi
Run Code Online (Sandbox Code Playgroud)
dam*_*ois 60
如果您希望脚本中的所有命令都具有该行为,请添加
set -e
set -o pipefail
Run Code Online (Sandbox Code Playgroud)
在脚本的开头.这对选项告诉bash解释器在命令以非零退出代码返回时退出.
但是,这不允许您打印退出消息.
Gra*_*ier 13
我已经破解了以下习语:
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."
Run Code Online (Sandbox Code Playgroud)
在每个命令前面提供信息性回声,并使用同一
if [ $? -ne 0 ];...
行跟随每个命令.(当然,如果您愿意,可以编辑该错误消息.)
Ben*_*oit 10
提供my_command
规范设计,即成功时返回0,然后&&
恰好与您想要的相反.你想要的||
.
另请注意,(
在bash中我似乎不对,但我不能尝试从哪里开始.告诉我.
my_command || {
echo 'my_command failed' ;
exit 1;
}
Run Code Online (Sandbox Code Playgroud)
小智 6
所述trap
外壳内置允许捕获的信号,以及其他有用的条件,包括失败的命令执行(即,非零返回状态)。因此,如果您不想显式测试每个命令的返回状态,您可以说trap "your shell code" ERR
,只要命令返回非零状态,就会执行 shell 代码。例如:
trap "echo script failed; exit 1" ERR
请注意,与捕获失败命令的其他情况一样,管道需要特殊处理;以上不会赶上false | true
。
如果要保留退出错误状态,并具有每行一个命令的可读文件,也可以使用:
my_command1 || exit $?
my_command2 || exit $?
Run Code Online (Sandbox Code Playgroud)
但是,这不会打印任何其他错误消息。但是在某些情况下,无论如何该错误都会由失败的命令打印出来。