我正在尝试使用Java在控制台上打印Shell脚本的输出。当我手动运行脚本时,我得到了
C:/Users/user1/Desktop/shell.sh: line 78: /usr/ucb/ps: No such file or directory
<STATUS>: Probe [ devicename ] is not running!
但是,当我尝试在Java程序上运行它时,输出未在控制台上打印。 我的代码是:
ProcessBuilder processBuilder = new ProcessBuilder("C:/Program Files/Git/git-bash.exe","C:/Users/user1/Desktop/shell.sh");
try {
Process process = processBuilder.start();
StringBuilder output = new StringBuilder();
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
output.append(line + "\n");
System.out.println(line);
}
int exitVal = process.waitFor();
if (exitVal == 0) {
System.out.println("Success!");
System.out.println(output);
System.exit(0);
} else {
//abnormal...
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
我得到的唯一输出是“成功”。调试代码时,我发现该代码从未输入条件
while ((line = reader.readLine()) != null)
即使在bash终端中,也有几行输出。为什么会这样?
此刻,我被困住了,无法找到任何其他有关此问题的解释。请帮助。
答案 0 :(得分:0)
您正在运行git-bash.exe,它将作为Windows应用程序打开。尽管Java可以访问git-bash.exe的stdout / stderr流,但它们不一定与git-bash.exe中的内部Shell脚本启动的stdout / err相同。
查看命令标准输出/错误的一种方法是制作.sh脚本的Java友好版本,该脚本将启动原始sh并将输出重定向到特定文件,然后您可以在java中对其进行访问。
ProcessBuilder pb = new ProcessBuilder("C:/Program Files/Git/GIT-BASH.EXE","/c/Users/blah/somescript.sh");
somescript.sh:
#!/bin/sh
runtheoriginalcommand > ~/somepath.out 2> ~/somepath.err
您还可以在包装器中添加额外的args,以传递要使用的out / err文件,因此不会与任何其他启动或硬编码的输出文件发生争用。