我是个菜鸟在外壳-脚本。我要打印的消息和出口我的剧本如果指令失败。我已经试过:

my_command && (echo 'my_command failed; exit)

但是它不工作。它不断执行的说明以下这条线在脚本。我使用的Ubuntu和抨击。

有帮助吗?

解决方案

尝试:

my_command || { echo 'my_command failed' ; exit 1; }

四变化:

  • 改变 &&||
  • 使用 { } 在地方 ( )
  • 介绍 ;exit
  • 空间后 { 和之前 }

因为你要打印的消息和出口,只有当的命令失败(退出与非零值)你需要一个 || 不是一个 &&.

cmd1 && cmd2

将运行 cmd2cmd1 成功的(出口价值 0).作为在那里

cmd1 || cmd2

将运行 cmd2cmd1 失败(出口价值的非零)。

使用 ( ) 使得命令他们跑一个 子壳 和一个叫 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
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top