2017-02-01 54 views
0

我想從java訪問UNIX shell但輸出不同,我不知道爲什麼。無法訪問java進程構建器的unix shell輸出

public class Test { 

    public static void main(String[] args) throws IOException,InterruptedException { 

     List<String> arg = new ArrayList<>(); 

     arg.add("echo"); 
     arg.add("$PATH"); 

     ProcessBuilder pb = new ProcessBuilder(arg); 
     Process p = pb.start(); 

     BufferedReader br; 

     if (p.waitFor() == 0) { 
      br = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     } else { 
      br = new BufferedReader(new InputStreamReader(p.getErrorStream()));   
     } 

     String str; 
     while ((str = br.readLine()) != null) { 
      System.out.println(str); 
     } 
    } 
} 

輸出:

$ PATH

然後我試圖讀取~/.bashrc文件進行閱讀的路徑。

public class Test { 
    public static void main(String[] args) throws IOException,InterruptedException { 

     List<String> arg = new ArrayList<>(); 

     arg.add("cat"); 
     arg.add("<"); 
     arg.add("~/.bashrc"); 

     ProcessBuilder pb = new ProcessBuilder(arg); 
     Process p = pb.start(); 

     BufferedReader br; 

     if (p.waitFor() == 0) { 
      br = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     } else { 
      br = new BufferedReader(new InputStreamReader(p.getErrorStream()));   
     } 

     String str; 
     while ((str = br.readLine()) != null) { 
      System.out.println(str); 
     } 

    } 
} 

輸出:

貓: '<':沒有這樣的文件或目錄

貓: '〜/ .bashrc中':沒有這樣的文件或目錄

回答

0

當您執行:

cat < ~/.bashrc 

你的shell解釋的命令,不帶任何參數執行cat,隨着~/.bashrc內容餵養它標準輸入

在這裏,你直接打電話cat以2個參數,<~/.bashrc(其中的方式是不是一個有效的文件名,~需要來解釋)。

因此,除非你想用的~/.bashrc內容手動輸入過程標準輸入,你可以只啓動一個,通過更換:

arg.add("cat"); 
arg.add("<"); 
arg.add("~/.bashrc"); 

由:

arg.add("bash"); 
arg.add("-c"); 
arg.add("cat < ~/.bashrc"); 

或者更簡單:

Collections.addAll(arg, "bash", "-c", "cat < ~/.bashrc"); 

甚至更​​簡單:

ProcessBuilder pb = new ProcessBuilder("bash", "-c", "cat < ~/.bashrc"); 
+0

OK,然後一個問題。爲什麼輸出爲''echo「,」$ PATH「'爲$ PATH? –

+0

出於同樣的原因。 – rom1v

0

如果您想詳細路徑就可以使用

System.out.println(System.getenv("PATH"));