为什么我的shell脚本的输出不能打印在控制台?

问题描述 投票:0回答:1

我试图用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终端,有几行输出。为什么会出现这种情况?

我卡在这一点上,我找不到任何其他解释来解决这个问题。请大家帮忙。

java shell spring-boot processbuilder
1个回答
0
投票

你正在运行git-bash.exe,它是以windows应用程序的形式打开的,虽然Java可以访问git-bash.exe的stdoutstderr流,但这些流不一定与git-bash.exe内部启动shell脚本的stdouterr相同。虽然 Java 可以访问 git-bash.exe 的 stdoutstderr 流,但这些流不一定与 git-bash.exe 内部启动 shell 脚本的 stdouterr 相同。

查看命令的stdouterr的一种方法是制作一个java友好版的.sh脚本,启动你的原始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

你也可以在wrapper中添加额外的args来传递要使用的 outerr文件,这样就不会与其他的启动文件或硬编码输出文件发生冲突。

© www.soinside.com 2019 - 2024. All rights reserved.