假设我有两个文件主目录和子目录在包含以下内容的同一文件夹中:
主.sh:
#!/usr/bin/env bash
export PARAMETER="main"
my_func(){
echo "$PARAMETER $1"
}
export -f my_func
# Run the other script
./sub.sh
子.sh:
#!/usr/bin/env bash
PARAMETER="sub"
my_func $PARAMETER
如果我们运行 main.sh,它将输出sub sub
,但我希望它输出main sub
。
有没有办法让 main.sh 中定义的函数始终使用 main.sh 中声明的值,而不限制在 main.sh 启动的脚本中使用该参数名称?我正在寻找不需要修改 sub.sh 的解决方案,因为在我的现实生活问题中,有很多类似 sub.sh 的函数。
编辑:
虽然我的问题已经得到解答,但这里有一些背景知识:
main.sh
是 docker 映像的入口点脚本。这个入口点基本上是一个大的 case 语句,并sub.sh
根据$1
.
我正在考虑创建一个实用函数以避免在脚本main.sh
中重新输入重复的例程。sub.sh
我不是唯一一个将类似 sub.sh 的脚本添加到图像中的人,这就是为什么我想避免接触这些脚本 - 我想为其他开发人员提供一个工具,而他们不需要知道它。
我的第一个想法是将 的值复制PARAMETER
到具有唯一名称的参数,例如my_func_PARAMETER
。这很可能确保该功能始终按预期工作。这时我想到是否可以导出参数已扩展的函数。
答案1
你可以创造参数已扩展的函数。由于您可以稍后覆盖它们(全局或在子 shell 中),因此您可以“使用已扩展的参数导出它们”。
#!/usr/bin/env bash
export PARAMETER="main"
eval "my_func(){
echo \"$PARAMETER \$1\"
}"
export -f my_func
# Run the other script
./sub.sh
或者
#!/usr/bin/env bash
export PARAMETER="main"
my_func(){
echo "$PARAMETER $1"
}
export -f my_func
# Run the other script
(
eval "my_func(){
echo \"$PARAMETER \$1\"
}"
./sub.sh
)
显然这没有多大意义。在您想要使用变量的旧内容之前,不会覆盖变量。
#!/usr/bin/env bash
LOCAL_PARAMETER="sub"
my_func "$LOCAL_PARAMETER"