父脚本调用子脚本:如果退出,如何保留在子脚本中设置的变量?

时间:2019-03-08 19:55:41

标签: bash

父脚本称为子​​脚本。子脚本设置一些变量,并以错误代码退出。调用脚本是否可以保留子脚本中设置的变量?在这种情况下,child.sh 无法被修改。

我尝试将source|| true组合在一起,但是没有用。

parent.sh

source ./child.sh || true

echo "testvar = $testvar"

child.sh

echo "In child script."
testvar="foo"
echo "testvar = $testvar"
exit 1

输出:

$ ./parent.sh
In child script.
testvar = foo

所需的输出:

$ ./parent.sh
In child script.
testvar = foo
testvar = foo

3 个答案:

答案 0 :(得分:2)

否,这是不可能的。而是,防止脚本退出。

通常可以通过覆盖exit来做到这一点:

$ cat parent.sh
shopt -s expand_aliases
alias exit=return
source ./child.sh
unalias exit
echo "testvar = $testvar"

执行后,脚本将被诱骗到return中:

$ bash parent.sh
In child script.
testvar = foo
testvar = foo

答案 1 :(得分:1)

如Felix所说:exit 1将终止外壳。

但是您可以激活EXIT Trap

#!/bin/bash

function cleanup {
    echo "testvar = ${testvar}"
}

trap cleanup EXIT

source ./child.sh

将导致:

In child script.
testvar = foo
testvar = foo

答案 2 :(得分:0)

尝试在来源return中使用exit代替child.sh

这可能就是您所需要的。

$: cat parent.sh
echo "in parent, pre child"
source ./child.sh
echo "in parent, post child"
echo "parent: testvar = $testvar"

$: cat child.sh
echo "In child script."
testvar="foo"
echo "child: testvar = $testvar"
return 1
echo never this

$: parent.sh
in parent, pre child
In child script.
child: testvar = foo
in parent, post child
parent: testvar = foo