0

我希望我的 Java 程序echo "text" > /home/maxbester/test.txt在几个基于 Unix 的系统上运行该命令。

我的代码如下所示:

private static final Logger LOG = Logger.getLogger(MyClass.class);
public String run(String cmd)  {
    String res = null;
    InputStream is = null;
    try {
        final Runtime rt = Runtime.getRuntime();
        final Process p = rt.exec(cmd);
        int exitStatus = -1;
        try {
            exitStatus = p.waitFor();
        } catch (InterruptedException e) {
            L0G.error(e.getMessage(), e);
        }
        is = p.getInputStream();

        if (exitStatus == 0) {
            if (is != null && is.available() > 0) {
                StringWriter stringWriter = new StringWriter();
                IOUtils.copy(is, stringWriter);
                res = stringWriter.toString();
            } else {
                L0G.error("InputStream is not available!");
            }
        }
    } catch (SecurityException e) {
        L0G.error(e.getMessage(), e);
    } catch (IOException e) {
        L0G.error(e.getMessage(), e);
    }
    return res;
}

当 cmd 等于echo "text" > /home/maxbester/test.txt并且文件 test.txt 存在时, res 包含"text" > /home/maxbester/test.txt(而不是echo "text" > /home/maxbester/test.txt显消失)并且 test.txt 为空。但是退出值为 0(因此它应该可以正常工作)。

我手动运行echo "text" > /home/maxbester/test.txt。没有返回任何内容,退出值也为 0。

那么 exec 命令出了什么问题呢?

4

2 回答 2

0

如果你想用 Java 将文本写入文件,你应该看看FileWriter而不是依赖于特定于 shell 的细节,例如流重定向。

于 2012-10-12T11:28:32.617 回答
0

如果你想让 exec 表现得像一个 shell,你必须调用一个 shell。例如

String shell = System.getEnv("SHELL");
cmd = shell + " -c \"echo test > /home/maxbester/test\"";

您的测试不读取标准错误。也许那里有一些有趣的东西。

于 2012-10-12T11:31:44.000 回答