簡體   English   中英

如何在 Java 中為 ProcessBuilder 拆分我的參數?

[英]How to split my arguments up for ProcessBuilder in Java?

我正在嘗試在 Java 中使用 ProcessBuilder,但我不太清楚如何為它拆分我的論點。 例如,此命令 + 參數find . -name 'rc*' find . -name 'rc*' 下面是一些不同的參數拆分,它們都沒有給我正確的結果。 知道我在爭論分裂中做錯了什么嗎?

//This is obvious error since I mixed arugments with the command
processBuilder.command("find . -name 'rc*'").directory(new File("/etc"))

//Gives me exit code 1 and no results
processBuilder.command("find", ". -name 'rc*'").directory(new File("/etc"))

//Gives me also exit code 1 and no results
processBuilder.command("find", ".", "-name", "'rc*'").directory(new File("/etc"))

//Gives me also exit code 1 and no results
processBuilder.command("find", ". -name", "'rc*'").directory(new File("/etc"))

//Gives me also exit code 1 and no results
processBuilder.command("find", ".", "-name 'rc*'").directory(new File("/etc"))

編輯

當我嘗試添加 .inheritIO() 並拆分所有參數時,它部分起作用,因為我得到了權限被拒絕的文件的打印輸出。

processBuilder.command("find", ". -name 'rc*'").directory(new File("/etc")).inheritIO();

但和以前一樣,它沒有列出我的其他“rc”文件。

Listing all rc files in /etc directory: 
//Here should be at least dozen files that print out when I use the command in terminal
Exit code: 1
find 'someFileName': Permission denied
find 'someFileName': Permission denied
find 'someFileName': Permission denied

我的過程和打印輸出部分

Process b;
b.processBuilder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(b.getInputStream()));
String line = "";
while((line = reader.readLine()) != null){
   System.out.println(line);
}

第二次編輯

問題是,如果我將 ProcessBuilder 命令更改為類似的命令(我猜),那么它會使用相同的代碼打印出沒有 prob 的結果文件 - 即我將命令更改為ls -a類的

processBuilder.command("ls","-a").directory(new File("/etc")).inheritIO(); 

//and then activate the process and print it just as before and all good ```

啟動來自 Java,因此無需使用單引號轉義查找參數rc* 諸如 bash 之類的 shell 會將rc*擴展為當前目錄中以“rc”為前綴的實際文件(並使用錯誤的搜索值),但 Java 不會這樣做。 此外,每個參數都必須在自己的字符串中:

processBuilder.command("find", ".", "-name", "rc*").directory(new File("/etc"));

或者

processBuilder.command("find", "/etc", "-name", "rc*");

如果 find 報告了很多錯誤,您可能會遇到進程凍結的問題,因為您沒有在讀取 STDOUT 的同時讀取 STDERR。 您可以選擇運行線程來使用流,或重定向 STDERR->STDOUT,或者在調用processBuilder.start()之前使用Process.redirectOutput(File)Process.redirectError(File)將兩個或合並的流發送到文件。 閱讀這個答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM