脚本可以修改其调用 shell 的环境变量吗?

脚本可以修改其调用 shell 的环境变量吗?

JAVA_HOME我正在我的文件中设置我的~/.bashrc

现在,我需要创建一个脚本来改变JAVA_HOME当前终端,以便我可以启动需要 java 5 的应用程序。

我已经创建了这个脚本来执行此任务,但完成后,我发现 JAVA_HOME 没有更新

export JAVA_HOME=/usr/lib/jvm/java-5-oracle/
export PATH=$PATH:$JAVA_HOME    

结果如下

$ ./javaHome5.sh
$ echo $JAVA_HOME
/usr/lib/jvm/java-6-oracle/

我认为这个没有被应用的原因是脚本正在它自己的终端中执行,所以当脚本结束时,当前终端不会受到影响。

目前,我发现解决此问题的唯一方法是:

  1. 编辑我的~/.bashrc并更改JAVA_HOME变量
  2. 运行source ~/.bashrc以在当前终端中应用更改。同样,这不能在脚本中应用,因为命令source需要在当前窗口中运行。

不用说,这个更改适用于所有新的终端窗口,所以我实际上需要执行两次:一次是在启动我的应用程序之前,另一次是在启动应用程序之后,只是为了将环境变量恢复为默认值。这真的不太方便。

您是否知道如何使用脚本来改变这个变量?

答案1

这是不可能的。正如您正确观察到的那样,您的脚本正在其自己的 shell 中执行。此 shell 在分叉时会获取其父 shell 环境的副本,并且无法访问父 shell 的环境。这很好,因为否则脚本可能会产生各种无法预料的副作用。;)

为了更改当前 shell 中的变量,您可以始终执行脚本文件(而不是将其作为独立进程执行),这样脚本将由当前 shell 执行,而不是分叉的 shell。如果您的脚本名为myscript.sh,请将其命名为 ,source myscript.sh而不是./myscript.sh

相关内容