我有以下脚本:

#!/bin/bash

set -e

function do_it {
    rm this-file-does-not-exit
    echo "Continuing ..."
    echo "Done ..."
    return 0
}

if do_it ; then
    echo "Success"
else
    echo "Error"
fi
echo "End of script"

产生:
rm: cannot remove 'this-file-does-not-exit': No such file or directory
Continuing ...
Done ...
Success
End of script

该函数不会被中止,因为在if语句中运行该函数会禁用该函数的set -e(并且无法启用)。这不是我想要的。

无法在if语句之外运行该函数并收集结果,因为在这种情况下,如果该函数失败,则完整的脚本将被中止:
#!/bin/bash

set -e

function do_it {
    rm this-file-does-not-exit
    echo "Continuing ..."
    echo "Done ..."
    return 0
}

do_it
if $? ; then
    echo "Success"
else
    echo "Error"
fi
echo "End of script"

产生:
rm: cannot remove 'this-file-does-not-exit': No such file or directory

我想要以下内容:
  • 顶级命令出现故障时,脚本将中止
  • 每当命令失败时,
  • 函数都会中止。失败命令的返回码作为函数返回码
  • 返回
    函数中的
  • 故障不会终止脚本(仅函数)

  • 可以如下实现:
    #!/bin/bash
    
    set -e
    
    function do_it {
        rm this-file-does-not-exit || return $?
        echo "Continuing ..." || return $?
        echo "Done ..." || return $?
        return 0
    }
    
    if do_it ; then
        echo "Success"
    else
        echo "Error"
    fi
    echo "End of script"
    

    哪个产生我想要的:
    rm: cannot remove 'this-file-does-not-exit': No such file or directory
    Error
    End of script
    

    但是,这使得该功能的实现完全不可读:每行必须后跟一个|| return $?
    每当函数中的语句失败时,还有另一种方法来中止函数和仅中止函数吗?

    最佳答案

    您可以使用“pipefail”来获取管道中最后执行的命令的返回码。
    我不会说它看起来比您的代码好得多,但至少它更短。

    #!/bin/bash
    
    set -ep
    
    function do_it {
        rm this-file-does-not-exit &&
        echo "Continuing ..." &&
        echo "Done ..."
        return $?
    }
    
    if do_it ; then
        echo "Success"
    else
        echo "Error"
    fi
    echo "End of script"
    

    在这种情况下,函数将在第一个失败的命令(rm)之后立即停止执行,结果将是管道中最后一个命令的返回代码。如果“rm ”将成功,则两个回显都应起作用,并且返回码将为0。

    输出:
    $ touch this-file-does-not-exit
    $ ./script-return.sh
    Continuing ...
    Done ...
    Success
    End of script
    $ ./script-return.sh
    rm: cannot remove 'this-file-does-not-exit': No such file or directory
    Error
    End of script
    

    关于linux - 如何中止仅在出错时起作用但不中止脚本?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59320542/

    10-11 21:09