我正在使用 Bash 4.4.20。我通常在每个 bash 脚本中都有 main 函数。如果我想从另一个 bash 脚本中的另一个函数获取此脚本,这会与两个脚本中的主函数定义冲突吗?
#A.sh
main() {
SomeFunction
}
SomeFunction(){
. B.sh
}
main "$@"
#B.sh
main(){
echo Hi
}
main "$@"
有没有不重命名main函数的解决方案?
答案1
另一个脚本将重新定义main()
,是的。尽管在这种特殊情况下,我不确定这是否重要,因为main()
当脚本 B 重新定义函数时,脚本 A 正在运行。我怀疑 shell 是否允许重新定义来改变已经运行的函数的行为。
也就是说,给定这些脚本:
$ cat a.sh
main() {
echo a1
. ./b.sh
echo a2
}
main "$@"
$ cat b.sh
main() {
echo b
}
main "$@"
使用任何 shell运行a.sh
我可以找到打印a1
, b
, a2
.如果再次a.sh
调用main
,那么它当然会得到新的行为。
但即使在这里并不重要,像这样动态地重新定义函数至少会让人感到困惑。
更好的问题是,为什么你需要来源首先脚本B?将 B 作为要通过采购加载的函数集合(某种库)似乎更清楚;或者将其作为一个独立的实用程序,作为常规程序调用,而不是来源。
在第一种情况下,A 将根据需要显式调用 A 中定义的函数。
答案2
简答 是的
长答案 如果您获取脚本,则与执行脚本相同,但在您自己的 shell 进程中。因此环境变量、函数名称等是共享的。看https://superuser.com/a/176788/222230