2012-02-20 16 views
3

我想回顯PATH變量,目標是從終端中獲得與終端中運行echo $PATH相同的Java ProcessBuilder輸出。但是,執行輸出時實際上是$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命令未找到爲我的單元測試之一。我正在使用this hack/trick來改變我的PATH,並通過檢查processBuilder.environment()的結果,並確信傳遞給進程的PATH變量不應該允許查找排序(我嘗試了空字符串以及隨機路徑) 。我想看看這個shell是否在做任何有趣的事情,並修復我試圖摧毀的PATH。

+0

而不是「回聲$路徑」,只是嘗試路徑,如果您使用的是Windows。 – 2012-02-20 21:09:44

回答

3

$PATHbash(和其他shell)中用來指代環境變量PATH的語法。由於它是echo您使用ProcessBuilder執行,而不是bash,因此它不打印環境變量的內容並不令人驚訝。

您應該從Java獲取環境變量的內容,並將其作爲外部進程的參數,或者執行能夠正確解釋語法(如bash)的程序。


正如下面的評論中指出,

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

確實打印PATH環境變量的內容。

+0

偉大的一點!我再次嘗試使用processBuilderCommand = ImmutableList.of(「/ bin/bash」,「 - c」,「echo $ PATH」);並按預期輸出路徑。現在我只是更困惑,它可以找到排序命令:-P – Zugwalt 2012-02-20 21:12:19

+0

啊,很高興你找到了'-c'開關,並設法讓bash解決PATH。如果有人遇到你的問題,但不打擾你的評論,我會用你的解決方案更新答案。 – aioobe 2012-02-20 21:14:38