用于重定向输出的shell脚本

时间:2011-11-08 11:13:46

标签: java linux shell unix redirect

我正在寻找有关shell脚本的帮助,以将命令的输出重定向到文件。我有一个C程序从串行端口和显示器读取输入。我希望将此数据重定向到文件。我正在通过调用

从java程序执行它
Runtime r = Runtime.getRuntime();
Process procObj = r.exec("sh " + scriptfile);

我尝试将脚本文件编写为

./program >> file.txt

file.txt没有得到更新。在这里,程序不会结束,直到与端口的连接丢失,从某种意义上说它是无限运行的。所以我的程序一直在寻找端口上的数据,并在它出现时显示。 我只需要将相同的输出重定向到我将用作日志的文件。 我看了How to make shell output redirect (>) write while script is still running?但没有帮助。

请帮助......

4 个答案:

答案 0 :(得分:2)

program产生多少输出?使用标准IO重定向将在stdoutfile之间添加4KB缓冲区。这意味着在OS开始写入文件之前,程序必须输出4KB以上的数据。

要解决此问题,请在“工作单位”完成时将stdout.flush()添加到您的程序中(可能是一行但可能超过一行)。

答案 1 :(得分:1)

您可以试试./program >> file.txt 2>>file.txt./program 2>&1 >>file.txt吗?

答案 2 :(得分:1)

试试这个

    List<String> cmd = new ArrayList<String>();
    cmd.add("sh");
    cmd.add("-c");
    cmd.add("program 1> file.txt 2>&1");

    ProcessBuilder pb = new ProcessBuilder(cmd);
    Process p = pb.start();

答案 3 :(得分:0)

如果您使用标准C调用输出(printfputs等),您的输出可能会被缓冲。在C89及更高版本中,它取决于缓冲模式(无缓冲,完全缓冲,行缓冲)和缓冲区大小,是否根本缓冲输出以及刷新缓冲区时(请参阅http://www.gnu.org/software/libc/manual/html_node/Buffering-Concepts.html和{ {1}})。

默认情况下,在Linux上完全缓冲输出到文件。如果希望输出立即显示在输出文件中,您可以:

此行为与您通过shell脚本在Java程序中启动C程序的事实无关。此行为取决于您链接到程序中的标准C库。