我希望我的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命令出了什么问题?
答案 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。也许那里有一些有趣的东西。