我有两个脚本主脚本和子脚本,我使用源脚本调用了下脚本,如果未安装指定的软件包,则它应返回退出代码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
答案 0 :(得分:1)
获取文件源时,请勿使用exit
,因为这将终止整个执行。而是在sub.sh中使用return
:
返回[n]
使函数以指定的返回值退出 由n。如果在函数外部使用,但在脚本执行期间使用 由。 (源)命令,它会导致shell停止执行该命令 脚本并返回n或最后一个命令的退出状态 在脚本内执行,作为脚本的退出状态。如果使用 在函数之外,而不是在执行脚本期间, 返回状态为假。
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
这是与您的问题有关的两个非常重要的属性:
如果您的sub_script
遇到的subScriptExitCode
与零不同。由于main_script
语句,它将立即终止exit
。
main_script
将subScriptExitCode
设置为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
只能返回0
或1
,因此您可以摆脱test
并将sub_script
减少为:
type -p <package>
type [-aftpP] name [name ...]
: ...type
如果找到所有参数,则返回true,如果找不到任何参数,则返回false。[来源:
man bash
]