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

yan*_*Lar 2 bash scripts environment-variables

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

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

我已经创建了这个脚本来完成这个任务,但是完成后,我可以看到 JAVA_HOME 没有更新

export JAVA_HOME=/usr/lib/jvm/java-5-oracle/
export PATH=$PATH:$JAVA_HOME    
Run Code Online (Sandbox Code Playgroud)

这是结果

$ ./javaHome5.sh
$ echo $JAVA_HOME
/usr/lib/jvm/java-6-oracle/
Run Code Online (Sandbox Code Playgroud)

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

目前,我找到的唯一方法是:

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

毋庸置疑,此更改适用于所有新的终端窗口,因此我实际上需要执行两次此操作:一次在启动我的应用程序之前,另一次是在此之后立即将环境变量恢复为默认值。那真的不太方便。

您有什么想法可以使用脚本更改此 var 吗?

Mal*_*ppa 7

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

为了更改当前 shell 中的变量,您始终可以获取脚本文件(而不是将其作为独立进程执行),因此脚本由当前 shell 执行,而不是分叉的。如果您的脚本被调用myscript.sh,请将其称为source myscript.sh而不是./myscript.sh

  • 别客气。:) 如果您还没有这样做,您可能希望在别名中使用绝对路径:`alias j5='source /absolute/path/to/myscript.sh'` 以便您可以从任何地方,独立于您当前的工作目录。 (2认同)