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

时间:2018-07-31 13:15:59

标签: bash shell exit-code

我有两个脚本主脚本和子脚本,我使用源脚本调用了下脚本,如果未安装指定的软件包,则它应返回退出代码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

3 个答案:

答案 0 :(得分:1)

获取文件源时,请勿使用exit,因为这将终止整个执行。而是在sub.sh中使用return

  

返回[n]

     

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

sub.sh

type -p <package>

subScriptExitCode="$?"

if [ "$subScriptExitCode" -ne 0 ]; then
    return 1
fi

答案 1 :(得分:0)

而不是采购子脚本,而是按如下所示运行它并检查返回代码

Main.sh

x

答案 2 :(得分:0)

如果您查看Bash的手册,那么请阅读

  

source filename [arguments]                 在当前Shell环境中从文件名读取并执行命令,并 返回从filename 执行的最后一条命令的退出状态。如果filename不包含...

     

来源:man bash

这是与您的问题有关的两个非常重要的属性:

  1. 如果您的sub_script遇到的subScriptExitCode与零不同。由于main_script语句,它将立即终止exit

  2. main_scriptsubScriptExitCode设置为if语句的退出状态。如果subScriuptExitCode中的sub_script等于0,则为零。

      

    if list; then list; [ elif list; then list; ] ... [ else list; ] fi ...退出状态是最后执行的命令的退出状态,如果没有条件测试为真,则为零。

         

    来源:man bash

仅使用source的属性来解决问题的可能方法是:

sub_script

type -p <package>
[ $? -eq 0 ]

在这里,如果0以零终止,则测试命令将以状态type p <package>退出,否则test-命令将以状态1退出。然后在您的main_source中以$?的状态出现。但是,由于type -p只能返回01,因此您可以摆脱test并将sub_script减少为:

type -p <package>
  

type [-aftpP] name [name ...] ... type如果找到所有参数,则返回true,如果找不到任何参数,则返回false。

     

[来源:man bash]