Java - exec不像shell那样

时间:2012-10-12 11:15:21

标签: java shell unix exec

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

我的代码如下:

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 echo 消失了)和test.txt是空的。但是退出值为0(因此它应该正常工作)。

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

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

2 个答案:

答案 0 :(得分:0)

如果要使用Java将文本写入文件,则应该查看FileWriter,而不是依赖于特定于shell的详细信息,例如流重定向。

答案 1 :(得分:0)

如果您希望exec的行为类似于shell,则必须调用shell。 E.g。

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

您的测试无法读取stderr。也许那里有一些有趣的东西。