Bash Unix shell脚本中是否可以进行异常处理,包括在内部调用另一个脚本

Bash Unix shell脚本中是否可以进行异常处理,包括在内部调用另一个脚本,bash,unix,exception,sh,Bash,Unix,Exception,Sh,我有一个场景,在这个场景中,我需要通过从shell脚本触发另一个外部bash文件来获取一些数据。如果我最终从外部bash得到任何错误输出,我的shell脚本应该能够处理,并且应该采用回退方法。但我实际上面临着外部bash文件的问题,其中bash在失败的情况下返回(exit 1),这导致我的脚本也退出,并且从不执行回退方法。任何人都可以指导如何处理从外部bash退出并运行我的后退方法。不确定这在sh中是否有效,但在bash中有效。 我用这个做了一个尝试/例外工具,但我相信它在这里也会起作用 #!

我有一个场景,在这个场景中,我需要通过从shell脚本触发另一个外部bash文件来获取一些数据。如果我最终从外部bash得到任何错误输出,我的shell脚本应该能够处理,并且应该采用回退方法。但我实际上面临着外部bash文件的问题,其中bash在失败的情况下返回(exit 1),这导致我的脚本也退出,并且从不执行回退方法。任何人都可以指导如何处理从外部bash退出并运行我的后退方法。

不确定这在sh中是否有效,但在bash中有效。 我用这个做了一个尝试/例外工具,但我相信它在这里也会起作用

#! /bin/bash

try() {
    exec 2> /dev/null
    #direct stderr out to /dev/null

    #main block
    input_function="$1"

    #fallback code
    catch_function="$3" 

    #open a sub shell
    (

    #tell it to exit upon encountering an error
    set -e

    #main block
    "$@"

    )

    #if exit code of above is > 0, then run fallback code
    if [ "$?" != 0 ]; then
        $catch_function
    else
        #success, it ran with no errors
        test
    fi

    #put stderr back into stdout
    exec 2> /dev/tty
}
使用这种方法的一个例子是:

try [function 1] except [function 2]
函数1将是主代码块,2将是回退函数/代码块。 您的第一个功能可能是:

run() {
  /path/to/external/script
}
你的第二个可以是你想依靠的任何东西。
希望这有帮助。

您可能应该使用
“$@”
,而不仅仅是
$@
。当其中一个参数包含空白时,这一点很重要。除非您希望
function 1
包含参数(
1
,在本例中,指向名为
function
)的函数/程序),否则您将进入一个复杂的领域。祝您好运!我会改变我的答案来反映这一点。非常感谢,我会尝试一下,让你知道这有很多问题。它首先假定标准错误是终端,不适用于任意“代码块”,只适用于带有参数的简单命令。我不认为简单地编写
if函数1有什么好处;然后测试;else功能2;fi 2>/dev/null
是当出现问题时,您将以非零状态退出以报告错误的方式正确运行的程序和脚本。如果是这样的话,很容易发现什么地方出了问题。如果没有,那么修复它们可能比编写代码来分析粗心大意编写的程序的标准错误输出更简单——假设它们编写得足够仔细,能够在标准错误上报告错误!如果他们也不注意这一点,那么你就会受到伤害。