使用 eval 设置环境变量-通过调用其他 shell 脚本

使用 eval 设置环境变量-通过调用其他 shell 脚本

我有两个 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是一个脚本。该脚本被解释为可能与父级使用相同的 shellCaller.sh),但不是由与父进程相同的实例(进程)所控制。子进程最初从父进程继承环境,但随后环境是独立的。

没有调试器Caller.sh只能改变自己的环境。你至少有两个选择:

  1. 要么开发一些内部程序Caller.sh来从子级获取价值(例子) 并相应地修改自己的环境。

  2. 或者以某种方式运行“子”shell 代码(当前在 中getGlobalParameters.sh),以便由 shell 解释 进行解释Caller.sh。您可以:

    • 来源getGlobalParameters.sh
    • 或者将其转换为内部的 shell 函数Caller.sh(并确保您在不是子 shell 中运行该函数)。

相关内容