2012-02-20 8 views
3

端末でecho $PATHと同じ出力をJava ProcessBuilderから取得するという目的で、 。ただし、実行時には、実際にはPATH変数の値の代わりに$PATHが出力されます。 ProcessBuilderが$をエスケープしているのではないかと思っていますが、これを防ぐトリックがありますか?

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コマンドをシミュレートしようとしています。ここ

は、私はそのことについて話しています何のコードサンプルは、文字列の「$ PATH」を出力します私のユニットテストの1つ。私はthisハック/トリックを使用して私のPATHを変更し、processBuilder.environment()の結果を検査して、プロセスに渡されるPATH変数がソートの検索を許可してはならないと確信しています(空の文字列とランダムなパスを試しました) 。シェルが何か面白いことをしているのか、私が破壊しようとしているPATHをバックアップしているのかを見たいと思います。

+0

"echo $ path"の代わりに、ウィンドウを使用している場合は、単にパスを入力してください。 –

答えて

3

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

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


としては

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

が実際にPATH環境変数の内容を印刷し、下記のコメントで指摘。

+0

大きなポイント!私はprocessBuilderCommand = ImmutableList.of( "/ bin/bash"、 " - c"、 "echo $ PATH")でもう一度試しました。期待どおりにパスを出力します。今、私はちょうどそれがsortコマンドを見つけることがもっと難解です: - P – Zugwalt

+0

ああ、あなたは '-c'スイッチを見つけて、bashがPATHを解決できるように管理してくれてうれしいです。他の人があなたの質問につきまとうが、あなたのコメントを読むのを邪魔しないならば、私はあなたのソリューションで答えを更新します。 – aioobe

関連する問題