源脚本中函数的行为

源脚本中函数的行为

在 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

请注意,变量最终也会被命名空间。

相关内容