有没有办法导出参数已扩展的函数?

有没有办法导出参数已扩展的函数?

假设我有两个文件主目录子目录在包含以下内容的同一文件夹中:

主.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"

相关内容