Bash 如何从源脚本获取退出代码
我有两个脚本主脚本和子脚本,我使用源脚本调用了子脚本,如果指定的包没有安装,那么它应该返回退出代码1 如果使用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
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