【问题标题】:Capturing the exit code of sourced shell script without invoking subshell在不调用 subshel​​l 的情况下捕获源 shell 脚本的退出代码
【发布时间】:2020-05-16 17:33:59
【问题描述】:

我有两个 shell 脚本:

test.sh

function func() {
echo $1
exit 1
}

运行.sh

source ./test.sh

func "Hello"
exitCode=$?
echo "Output: ${exitCode}"

结果:

Hello

我目前面临的问题是,当函数 func 返回 1 时,我的 run.sh 脚本会中断,之后不会执行任何操作。那么,有什么方法可以在不破坏 run.sh 的情况下有效地捕获退出代码。我知道有办法使用( func "Hello" ) 调用子shell,但我想在不使用flock 调用子shell 的情况下做到这一点。我查找了参考示例,但找不到任何接近它的示例。

【问题讨论】:

  • exit 表示exit。执行该命令后,该进程将被终止并返回任何指定的退出值。 Yo如果您输入run.sh ; echo "rc=$?,您应该会看到您的1 值回显。下面听起来是个好主意。祝你好运。
  • exit 用在scripts,而return 用在functions 这就是你想做的吗?
  • 我知道,但是由于我没有权限使用方法更改脚本,所以我必须在自己的脚本中进行错误处理。
  • 为什么子shell必须使用'flock'?

标签: bash shell sh flock


【解决方案1】:

2 个“突破界限”的想法。 谨慎使用,因为将来对源脚本的更改可能会破坏逻辑。仅当有一种方法可以监控该脚本是否正常工作时才推荐使用 - 例如交互执行时等。

我不会在任何生产/关键系统中使用这种解决方案。

选项 1:获取文件时将“exit”别名为“return”。

假设 test.sh 中的所有 'exit' 语句都将替换为 'return',并假设您愿意承担未来对 test.sh 进行更改的风险,请考虑在采购之前使用 alias

alias exit=return
source test.sh
unalias exit
func "foo"

选项2:自动更新使用'exit'的函数以使用return。

source test.sh
body=$(type func | tail +2 | sed -e 's/exit/return/g')
eval "$body"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-26
    • 2012-03-05
    • 2013-08-28
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    相关资源
    最近更新 更多