我有两个 shell 脚本 Caller 和 getGlobalParameters。getGlobalParameters 脚本中定义了一个函数,它调用一个 Java 类并使用 Java 类返回的值来设置环境变量。对 getGlobalParameters 的调用完成后,调用者将尝试使用 getGlobalParameters 设置的环境变量。我面临的问题是调用者无法访问 getGlobalParameters 设置的环境变量。以下是 Caller 和 getGlobalParameters 的代码片段。
Caller.sh
GETGLOBALPARAMETERS=getGlobalParameters.sh
jobName=ABC
JOBENV=TEST
eval '$GETGLOBALPARAMETERS $jobName $JOBENV'
printenv
#In the printenv statement above I am not seeing the environment variables set by the getGlobalParameters
getGlobalParameters.sh -
#Sample OUTPUT value a^1$b^2
IFS='$' read -r -a array <<< "$OUTPUT"
declare -A configkeys
for element in "${array[@]}"
do
IFS='^' read -r -a temparray <<< "$element"
configkeys[${temparray[0]}]=${temparray[1]}
done
for key in "${!configkeys[@]}"; do
export "${key}="${configkeys[$key]}""
done
printenv
#In the above printenv I am able to see the environment variables.
有人能看一下并告诉我我遗漏了什么吗?我已经花了一天时间解决这个问题,但找不到任何解决办法。
答案1
除此以外,source
您还可以更改此行:
getGlobalParameters.sh -
成为
. getGlobalParameters.sh
这将在当前 shell 中执行命令,并且您将能够访问里面设置的变量。
线路相同
eval '$GETGLOBALPARAMETERS $jobName $JOBENV'
成为
. $GETGLOBALPARAMETERS $jobName $JOBENV
答案2
您eval '$GETGLOBALPARAMETERS $jobName $JOBENV'
实际上意味着:
getGlobalParameters.sh ABC TEST
其中getGlobalParameters.sh
是可执行文件。与任何可执行文件一样,它在自己的环境中运行,并且无法更改其父级的环境。它的“偶然”getGlobalParameters.sh
是一个脚本。该脚本被解释为可能与父级使用相同的 shell(Caller.sh
),但不是由与父进程相同的实例(进程)所控制。子进程最初从父进程继承环境,但随后环境是独立的。
没有调试器,Caller.sh
只能改变自己的环境。你至少有两个选择:
要么开发一些内部程序
Caller.sh
来从子级获取价值(例子) 并相应地修改自己的环境。或者以某种方式运行“子”shell 代码(当前在 中
getGlobalParameters.sh
),以便由 shell 解释 进行解释Caller.sh
。您可以:- 来源
getGlobalParameters.sh
- 或者将其转换为内部的 shell 函数
Caller.sh
(并确保您在不是子 shell 中运行该函数)。
- 来源