6

ターミナルで実行されているのと同じ出力をJavaProcessBuilderから取得することを目的として、PATH変数をエコーし​​たいと思いますecho $PATH。ただし、実行すると、実際$PATHにはPATH変数の値ではなく出力になります。ProcessBuilderが$をエスケープしているのではないかと思いますが、これを防ぐためのトリックはありますか?

これは、文字列「$PATH」を出力する私が話しているもののコードサンプルです。

List<String>  processBuilderCommand = ImmutableList.of("echo","$PATH");

ProcessBuilder processBuilder = new ProcessBuilder(processBuilderCommand).redirectErrorStream(true);

final Process process = processBuilder.start();

String commandOutput = CharStreams.toString(CharStreams.newReaderSupplier(new InputSupplier<InputStream>() {
                @Override
                public InputStream getInput() throws IOException {
                    return process.getInputStream();
                }
            }, Charset.defaultCharset()));

System.out.println(commandOutput);

いくつかの追加のコンテキスト:

sort単体テストの1つでコマンドが見つからないことをシミュレートしようとしています。私はこのハック/トリックを使用してPATHを変更し、結果を調べprocessBuilder.environment()て、プロセスに渡されるPATH変数がソートを見つけられないことを確認します(空の文字列とランダムパスを試しました)。シェルが何かおかしなことをしていて、破壊しようとしているPATHをバックアップしているかどうかを確認したいと思います。

4

1 に答える 1

7

$PATHbash環境変数を参照するために(および他のシェルで)使用される構文ですPATH。ProcessBuilderを使用してecho実行するためbash、環境変数の内容が出力されないことはそれほど驚くことではありません。

Javaから環境変数の内容を取得し、それを外部プロセスへの引数として指定するか、構文を適切に解釈できるプログラム$PATH(などbash)を実行する必要があります。


以下のコメントで指摘されているように、

[...]  ImmutableList.of("/bin/bash","-c","echo $PATH")  [...]

実際、PATH環境変数の内容を出力します。

于 2012-02-20T21:02:18.290 に答える