Bash 如何从源脚本获取退出代码

Bash 如何从源脚本获取退出代码,bash,shell,exit-code,Bash,Shell,Exit Code,我有两个脚本主脚本和子脚本,我使用源脚本调用了子脚本,如果指定的包没有安装,那么它应该返回退出代码1 如果使用bash main.sh运行主脚本,则无法从主脚本获取subScriptExitCode 主脚本 source "sub.sh" subScriptExitCode=$? log "subScript ExitCode: $subScriptExitCode" if [ $subScriptExitCode -ne 0 ]; then exit $subScriptExit

我有两个脚本主脚本和子脚本,我使用源脚本调用了子脚本,如果指定的包没有安装,那么它应该返回退出代码1

如果使用
bash main.sh
运行主脚本,则无法从主脚本获取subScriptExitCode

主脚本

source "sub.sh"

subScriptExitCode=$?

log "subScript ExitCode: $subScriptExitCode"

if [ $subScriptExitCode -ne 0 ]; then
    exit $subScriptExitCode
fi
type -p <package>

subScriptExitCode=$?

if [ $subScriptExitCode -ne 0 ]; then
    exit 1
fi
子脚本

source "sub.sh"

subScriptExitCode=$?

log "subScript ExitCode: $subScriptExitCode"

if [ $subScriptExitCode -ne 0 ]; then
    exit $subScriptExitCode
fi
type -p <package>

subScriptExitCode=$?

if [ $subScriptExitCode -ne 0 ]; then
    exit 1
fi
type-p
subScriptExitCode=$?
如果[$subscribptexitcode-ne 0];然后
出口1
fi

不要寻找子脚本,而是按如下方式运行它并检查返回代码

Main.sh

sh sub.sh

subScriptExitCode=$?

log "subScript ExitCode: $subScriptExitCode"

if [ $subScriptExitCode -ne 0 ]; then
    exit $subScriptExitCode
fi

不要寻找子脚本的来源,而是按如下方式运行它并检查返回代码

Main.sh

sh sub.sh

subScriptExitCode=$?

log "subScript ExitCode: $subScriptExitCode"

if [ $subScriptExitCode -ne 0 ]; then
    exit $subScriptExitCode
fi

源文件时,不要使用
exit
,因为这将终止整个执行。相反,在sub.sh中使用
return

返回[n]

使函数以指定的返回值退出 由。如果在函数外部使用,但在脚本执行期间使用 由。(source)命令,它会导致shell停止执行该命令 脚本并返回n或最后一个命令的退出状态 作为脚本的退出状态在脚本中执行。如果使用 在函数外部,而不是在执行脚本期间 返回状态为false

sub.sh
type-p
subScriptExitCode=“$?”
如果[“$subscribptexitcode”-ne 0];然后
返回1
fi

当文件来源时,不要使用
exit
,因为这将终止整个执行过程。相反,在sub.sh中使用
return

返回[n]

使函数以指定的返回值退出 由。如果在函数外部使用,但在脚本执行期间使用 由。(source)命令,它会导致shell停止执行该命令 脚本并返回n或最后一个命令的退出状态 作为脚本的退出状态在脚本中执行。如果使用 在函数外部,而不是在执行脚本期间 返回状态为false

sub.sh
type-p
subScriptExitCode=“$?”
如果[“$subscribptexitcode”-ne 0];然后
返回1
fi

如果您看过Bash的手册,那么您可以阅读

源文件名[参数]
在当前shell环境中读取并执行文件名中的命令,并返回从文件名执行的最后一个命令的退出状态。如果
文件名
不包含

来源:
manbash

以下是与您的问题相关的两个非常重要的属性:

  • 如果您的
    sub_脚本
    遇到与零不同的
    subScriptExitCode
    。由于
    exit
    语句,它将立即终止
    main_脚本

  • main_脚本
    subScriptExitCode
    设置为if语句的退出状态。如果
    sub_脚本的
    subscribupExitCode
    等于
    0
    ,则该值为零

    如果列表;然后列出;[elif list;然后list;]。。。[其他列表;]fi
    。。。退出状态是最后执行的命令的退出状态,如果没有条件测试为真,则为零

    来源:
    manbash

  • 解决问题的一种可能方法是,仅使用
    source
    的属性:

    子脚本

    type -p <package>
    [ $? -eq 0 ]
    
    键入[-aftpP]名称[名称…]
    type
    如果找到所有参数,则返回true;如果没有找到任何参数,则返回false

    [来源:
    manbash
    ]


    如果你看一下Bash的手册,你就会读到

    源文件名[参数]
    在当前shell环境中读取并执行文件名中的命令,并返回从文件名执行的最后一个命令的退出状态。如果
    文件名
    不包含

    来源:
    manbash

    以下是与您的问题相关的两个非常重要的属性:

  • 如果您的
    sub_脚本
    遇到与零不同的
    subScriptExitCode
    。由于
    exit
    语句,它将立即终止
    main_脚本

  • main_脚本
    subScriptExitCode
    设置为if语句的退出状态。如果
    sub_脚本的
    subscribupExitCode
    等于
    0
    ,则该值为零

    如果列表;然后列出;[elif list;然后list;]。。。[其他列表;]fi
    。。。退出状态是最后执行的命令的退出状态,如果没有条件测试为真,则为零

    来源:
    manbash

  • 解决问题的一种可能方法是,仅使用
    source
    的属性:

    子脚本

    type -p <package>
    [ $? -eq 0 ]
    
    键入[-aftpP]名称[名称…]
    type
    如果找到所有参数,则返回true;如果没有找到任何参数,则返回false

    [来源:
    manbash
    ]


    您可能更喜欢使用
    返回
    而不是
    退出
    内部sub.sh您可能更喜欢使用
    返回
    而不是
    退出
    内部sub.sh
    [$?-eq 0]
    仅将所有非零值更改为1;它没有其他有用的用途——也就是说,
    sub_script
    的退出状态将是最后一个命令的退出状态,
    type-p
    ,如果没有它。@charlesduff我刚刚明白你的意思。我更新了帖子以反映这一点。
    [$?-eq 0]
    仅将所有非零值更改为1