web-dev-qa-db-ja.com

スクリプトは呼び出しシェルの環境変数を変更できますか?

Java_HOMEファイルに~/.bashrcを設定しています。

ここで、Java 5を必要とするアプリを起動できるように、現在の端末だけでJava_HOMEを変更するスクリプトを作成する必要があります。

このタスクを実行するためにこのスクリプトを作成しましたが、終了後、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 varを変更します
  2. source ~/.bashrcを実行して、現在の端末に変更を適用します。 sourceコマンドは現在のウィンドウで実行する必要があるため、これもスクリプトに適用できません。

言うまでもなく、この変更はすべての新しいターミナルウィンドウに適用されるため、実際には2回行う必要があります。1つはアプリを起動する前、もう1つは環境変数をデフォルトに戻すためだけです。それは本当に便利ではありません。

スクリプトを使用してこの変数を変更する方法はありますか?

2
yannicuLar

それは不可能。正しく確認したように、スクリプトは独自のシェルで実行されています。このシェルは、フォークされたときに親シェルの環境のコピーを取得します。親シェルの環境にアクセスする方法はありません。そうしないと、スクリプトがあらゆる種類の予期しない副作用を引き起こす可能性があるためです。 ;)

現在のシェルの変数を変更するには、スクリプトファイルを(独立したプロセスとして実行するのではなく)いつでもソースできるため、分岐したスクリプトではなく、現在のシェルによってスクリプトが実行されます。スクリプトの名前がmyscript.shの場合、source myscript.shではなく./myscript.shとして呼び出します。

6
Malte Skoruppa