「Java」ProcessBuilderの環境変数について

ProcessBuilder の環境変数についてのメモです。

・ProcessBuilder (Java Platform SE 8)
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/ProcessBuilder.html

ProcessBuilder が利用する環境変数については、ドキュメントに

このプロセス・ビルダーの環境の文字列マップのビューを返します。プロセス・ビルダーが作成されるたびに、環境は現在のプロセス環境のコピーに初期化されます(System.getenv()を参照)。これ以降、このオブジェクトのstart()メソッドで起動されたサブプロセスは、このマップを環境として使用します。

返されたオブジェクトは、通常のMap操作を使って変更できます。これらの変更は、start()メソッドを使って起動されたサブプロセスで可視になります。2つのProcessBuilderインスタンスは常に独立したプロセス環境を持っています。このため、返されたマップへの変更が、他のProcessBuilderインスタンスや、System.getenvから返される値に反映されることはありません。

とありますので、ProcessBuilder で起動されたプロセスで変更なりされた環境変数は他に影響を与えることはないとのことです。


動作を確認してみます。

・ProcessBuilderTest.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;

public class ProcessBuilderTest {
        public static void main(String[] args) {
                ProcessBuilderTest pbs = new ProcessBuilderTest();
                String[] command = {"sh", "-c", ". /tmp/env/env_export.sh; /tmp/env/env_echo.sh"}; // . を利用してカレントシェル上で env_export.sh を実行
                ProcessBuilder pb = new ProcessBuilder(command);
                Map<String, String> env = pb.environment();
                env.put("AAA", "aaa");
                pb.redirectErrorStream(true);
                try {
                        Process p = pb.start();
                        pbs.print(p.getInputStream());
                        p.waitFor();
                } catch (IOException e) {
                        e.printStackTrace();
                } catch (InterruptedException e) {
                        e.printStackTrace();
                }
        }

        private void print(InputStream is) throws IOException {
                try (BufferedReader br = new BufferedReader(new InputStreamReader(is));) {
                        String line;
                        while ((line = br.readLine()) != null) {
                                System.out.println(line);
                        }
                }
        }
}

・env_export.sh

#!/bin/sh

export HOGE=hoge
export UGA=uga

・env_echo.sh

#!/bin/sh

echo $HOGE
echo $UGA

・実行結果

# javac ProcessBuilderTest.java 
# java ProcessBuilderTest
hoge
uga

# echo $HOGE

# echo $UGA


HOGEUGA ともに値は設定されていませんね。

簡単ですが、以上になります。

[環境情報]
CentOS 7
Java SE 8 Update 92