【问题标题】:Why does the output of my shell script doesn't print in console?为什么我的 shell 脚本的输出没有在控制台中打印?
【发布时间】:2020-03-21 21:43:12
【问题描述】:

我正在尝试使用 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 终端中,也有输出行。为什么会这样?

我被困在这一点上,我找不到任何其他解释这个问题。请帮忙。

【问题讨论】:

  • 显示shell脚本
  • @dassum shell 文件基本上有 200 行长,对我来说没有任何意义。但我也尝试使用基本的回显消息,它不打印输出。
  • 你可以尝试使用带有 echo 消息的 hello world shell 脚本吗?
  • bash 脚本可以打印到标准输出或标准错误。所以也许你的脚本打印到标准错误?您可以从process.getErrorStream() 而不是process.getInputStream() 获得。
  • @dassum 是的,我试过了,但是控制台中没有打印回显消息。

标签: java shell spring-boot processbuilder


【解决方案1】:

您正在运行作为 Windows 应用程序打开的 git-bash.exe。尽管 Java 可以访问 git-bash.exe 的 stdout/stderr 流,但这些不一定与 git-bash.exe 中的 shell 脚本内部启动的 stdout/err 相同。

查看命令的 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

您还可以向包装器添加额外的参数以传递要使用的 out/err 文件,这样就不会与任何其他启动或硬编码的输出文件发生争用。

【讨论】:

    猜你喜欢
    • 2021-11-20
    • 2022-01-26
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    相关资源
    最近更新 更多