java - 为什么我的 shell 脚本的输出没有在控制台中打印?
问题描述
我正在尝试使用 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 终端中,也有输出行。为什么会这样?
我被困在这一点上,我找不到任何其他解释这个问题。请帮忙。
解决方案
您正在运行作为 Windows 应用程序打开的 git-bash.exe。尽管 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");
一些脚本.sh:
#!/bin/sh
runtheoriginalcommand > ~/somepath.out 2> ~/somepath.err
您还可以向包装器添加额外的参数以传递要使用的 out/err 文件,这样就不会与任何其他启动或硬编码的输出文件发生争用。
推荐阅读
- python - 这里有没有人尝试在 Python 上对 Scytale Cipher 进行编码和解码?
- linux - Stat 命令将具有更改日期的文件列入候选名单
- assembly - RISC-V程序计算4个数字的算术平均值
- git - 克隆 repo 时符号链接变成文本文件
- ruby-on-rails - 从主表中获取 id 和名称 - Ruby
- python - 我将如何继续从群组中仅抓取在线电报成员?
- java - 为 imageview 图像添加淡入效果 [Android]
- java - 从二进制字符串中查找可能的对
- javascript - Chrome扩展,如果重复标签阻止点击元素
- python - pandas to_sql() 替换表但保留列名