単一のシェルスクリプトで実行してエクスポートする方法

単一のシェルスクリプトで実行してエクスポートする方法

2つのシェルスクリプトがあります。

$ 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

これら2つのステップを同時に完了するにはどうすればよいですか?

答え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'

これにより、スクリプトがで始まるインラインスクリプトで実行されます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この変数は新しい端末でも変更されます。以前はjava7これjava8に変更されました。

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

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

$

関連情報