在 script1.sh 和 script2.sh 都包含名称相同但定义不同的函数的情况下,如果该函数是从 script1.sh 执行的,则 script2.sh 源自 script1.sh。将调用哪个函数?
我尝试模拟这个案例。如果该函数是从 script1.sh 执行的,则它仅使用 script1.sh 中定义的函数。然而,这种行为在所有情况下都是一致的吗?
脚本1.sh
#!/bin/bash
source script2.sh
execute() {
echo "Hello"
}
execute
脚本2.sh
#!/bin/bash
execute() {
echo "Something"
}
答案1
在这种情况下,您可以将函数视为变量:它将具有您分配给它的最后一个值。就像如果你有这样的东西:
var=foo
var=bar
var=baz
echo "$var"
在上面的情况下,我希望很明显echo "$var"
会打印出来,baz
因为每次为变量分配一个值时,都会覆盖它之前可能具有的任何值。函数以同样的方式工作。如果多次定义同名函数,则只有最后一个定义是相关的,其他定义将丢失。
采购并不会改变这一点。如果您从文件中获取函数,然后重新定义具有相同名称的新函数,则只有新函数可以工作。相反,如果您在脚本中定义一个函数,然后使用同名函数获取文件,则只有获取的文件才有效。
所以是的,它是完全一致的,操作的顺序定义了实际使用的内容。
答案2
为了完整起见,如果您希望能够使用这两个函数,您可以切换到 ksh93(shell bash 无论如何都会尝试模拟),您可以在其中使用命名空间。
而不是做:
source script2.sh
(顺便说一句,在 bash 中,就像在 ksh 中一样,script2.sh
在$PATH
其中查找可能不是您想要的),执行以下操作:
namespace script2 {
source ./script2.sh # the one in the current directory not in $PATH!
}
function execute {
echo "Hello"
}
execute # the one from the global namespace
.script2.execute # the one from the script2 namespace
请注意,变量最终也会被命名空间。