如何在单个 shellscript 中执行和导出

如何在单个 shellscript 中执行和导出

我有两个 shell 脚本。

$ cat java_alternative_7
#!/bin/sh
sudo update-java-alternatives -s java-7-oracle

$ cat java_home_7
#!/bin/sh
export JAVA_HOME=/usr/lib/jvm/java-7-oracle

我可以执行/获取这两个文件,这很简单。

$ sh java_alternative_7
$ javac -version
javac 1.7.x_yy

$ source java_home_7
$ echo $JAVA_HOME
/usr/lib/jvm/java-7-oracle

如何一次完成这两个步骤?

答案1

如果您不想合并脚本,如

#!/bin/sh

sudo \
    env JAVA_HOME=/usr/lib/jvm/java-7-oracle \
    update-java-alternatives -s java-7-oracle

你可以使用

#!/bin/sh

sudo \
    env BASH_ENV=path/to/java_home_7 \
    bash -c 'update-java-alternatives -s java-7-oracle'

这将导致脚本在从with 开始的内联脚本update-java-alternatives中运行。该实用程序将环境变量设置为设置环境变量的脚本的路径名。这会导致脚本在调用实用程序之前自动获取其他脚本的源。bash -cenvsudoenvBASH_ENVJAVA_HOMEbash -cupdate-java-alternatives

使用env设置环境变量可确保设置变量,即使sudo最初可能会清除环境。

答案2

我不确定我是否意识到自己在做什么。任何意见或建议将不胜感激。

$ cat java7
#!/bin/sh
alternative=java-7-oracle
sudo update-java-alternatives -s $alternative
export JAVA_HOME=/usr/lib/jvm/$alternative

$ cat java8
#!/bin/sh
alternative=java-8-oracle
sudo update-java-alternatives -s $alternative
export JAVA_HOME=/usr/lib/jvm/$alternative

$ . java7;javac -version;echo $JAVA_HOME
javac 1.7.x_yy
/usr/lib/jvm/java-7-oracle

$ . java8;javac -version;echo $JAVA_HOME
javac 1.8.x_yy
/usr/lib/jvm/java-8-oracle

更新

我正在为自己和任何需要的人进行更新。

首先,我将以下行添加到我的~/.bashrc.

#http://serverfault.com/a/276221/113357
export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")

还有我的新~/bin/java_home剧本。

#!/bin/bash
if [ $# -ne 1 ]
then
    echo please select a jname.
    update-java-alternatives -l
    return;
fi
jname=$1
sudo update-java-alternatives -s $jname
source ~/.bashrc

当我想更改 JDK 时,我就会这样做。

$ source java_home java-7-oracle
$ source java_home java-8-oracle

JAVA_HOME即使在任何新终端中,该变量也会发生变化。以前java7java8改成这样。

$ echo java7
#!/bin/sh
source java_home java-7-oracle

$ echo java8
#!/bin/sh
source java_home java-8-oracle

$

相关内容