如何强制 script.sh 作为子壳而不是子壳运行?

How to force script.sh to run as subshell not child?

提问人:OfusJK 提问时间:12/16/2022 更新时间:12/16/2022 访问量:193

问:

我有几种 buildA.sh,buildB.sh,......编译一些代码的脚本。 我还有一个通用脚本 common.sh,用于预处理、设置环境和设置陷阱命令。

cat common.sh 
~~~
./buildA.sh  #call build.sh, other build.sh run in other directory.
~~~

我需要从 common.sh build.sh 作为子 shell 运行,以重用陷阱命令和对 common.sh 的非导出变量访问 有什么方法可以做到这一点或解决方法吗?

bash 子壳

评论

0赞 OfusJK 12/16/2022
我已经尝试过exec buildA.sh,它取代了 common.sh 但陷阱和变量消失了。
0赞 Itération 122442 12/16/2022
我不知道这是否可行,但如果没有,解决方法是将您的陷阱和变量放在文件中,然后从您的 buildX.sh 中获取它。
0赞 Philippe 12/16/2022
这是你想要的吗:?. ./buildA.sh
0赞 OfusJK 12/16/2022
谢谢,您的答案可能是一种解决方法。
0赞 OfusJK 12/22/2022
从注释中,我对序列重新排序。我修改了每个脚本(buildA.sh buildB.sh 和...)以运行源代码 common.sh。谢谢。

答:

2赞 redseven 12/16/2022 #1

您必须使用脚本才能在当前 shell 中运行它。这不是一个子外壳,但我认为这就是你真正想要的:source

source build.sh

或等效的简单语法:

. build.sh

评论

0赞 OfusJK 12/16/2022
我认为使用源代码是最可接受的选择。我以为还有别的办法。来源就足够了。谢谢redseven和Philippe。
0赞 OfusJK 12/17/2022
如果我使用“source”,$LINE 和 $BASH_SOURCE 总是返回那行“source build.sh”而不是实际内容。<代码>----陷阱“exitcode=$?LINE=$LINENO echo “[ERROR]: $BASH_SOURCE: $LINE: $BASH_COMMAND: exit $exitcode” exit $exitcode 'ERR EXIT ... -----</code>