题
我是个菜鸟在外壳-脚本。我要打印的消息和出口我的剧本如果指令失败。我已经试过:
my_command && (echo 'my_command failed; exit)
但是它不工作。它不断执行的说明以下这条线在脚本。我使用的Ubuntu和抨击。
解决方案
尝试:
my_command || { echo 'my_command failed' ; exit 1; }
四变化:
- 改变
&&
要||
- 使用
{ }
在地方( )
- 介绍
;
后exit
和 - 空间后
{
和之前}
因为你要打印的消息和出口,只有当的命令失败(退出与非零值)你需要一个 ||
不是一个 &&
.
cmd1 && cmd2
将运行 cmd2
时 cmd1
成功的(出口价值 0
).作为在那里
cmd1 || cmd2
将运行 cmd2
时 cmd1
失败(出口价值的非零)。
使用 ( )
使得命令他们跑一个 子壳 和一个叫 exit
从没有使你退出子壳,而不是你的原壳,因此将继续执行在你原来的外壳。
为了克服这种使用 { }
最后两个变化都需要通过抨击。
其他提示
其他的答案已经涵盖了直接的问题很好,但你也可能有兴趣使用set -e
。就这样,失败的任何命令(如if
测试具体语境之外)会导致脚本终止。对于某些脚本,这是非常有用的。
如果你想在你的脚本中的所有命令该行为,只需添加
set -e
set -o pipefail
在脚本的开头。这对选项告诉bash的解释器出口每当与非零退出代码的命令返回。
这不允许打印一个退出消息,虽然。
还要注意,每个命令的退出状态被存储在shell变量$?你可以运行该命令后,立即检查。非零状态指示故障:
my_command
if [ $? -eq 0 ]
then
echo "it worked"
else
echo "it failed"
fi
我已经入侵了以下成语:
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 ];...
线。 (当然,可以如果要编辑该错误消息。)
本发明提供my_command
被规范地设计,即返回0成功时,则&&
正是你想要什么相反。你想||
。
另外请注意,(
看起来不正确我在bash,但是我无法从我在哪里尝试。告诉我。
my_command || {
echo 'my_command failed' ;
exit 1;
}
您也可以使用,如果你想保留退出错误状态,并与每行一个命令一个可读的文件:
my_command1 || exit $?
my_command2 || exit $?
此,但是将不打印任何附加的错误信息。但在某些情况下,该错误将被由故障命令反正打印。
在trap
外壳内置允许捕获的信号,以及其他有用的条件,包括失败的命令执行(即,非零返回状态)。所以,如果你不想每一个命令明确测试返回状态,你可以说trap "your shell code" ERR
和shell代码会被执行的任何时间命令返回非零状态。例如:
trap "echo script failed; exit 1" ERR
注意的是,与捕捉失败的命令的其它情况下,管道需要特殊处理;以上不会赶上false | true
。
以下功能仅回波错误,如果一个命令失败:
silently () {
label="${1}"
command="${2}"
error=$(eval "${command}" 2>&1 >"/dev/null")
if [ ${?} -ne 0 ]; then
echo "${label}: ${error}" >&2
exit 1
fi
}