下面是一个执行linux bash命令的python脚本" echo Hello World> ./output"
import os
os.system("bash -c \"echo Hello World > ./output\"");
我正在尝试用Java做同样的事情。以下是我的最大努力,按照我在此处找到的说明进行操作:Want to invoke a linux shell command from Java
import java.io.IOException;
public class callCommand {
public static void main(String[] args) {
try {
Process p = Runtime.getRuntime().exec(
new String[]{"bash","-c",
"\"echo Hello World > ./output\""});
} catch(IOException e) {
e.printStackTrace();
}
}
}
它没有问题编译,并且没有投诉地运行,但是没有生成输出文件。
答案 0 :(得分:2)
应删除echo ...
周围的额外引号:
Process p = Runtime.getRuntime().exec(new String[]{
"bash", "-c",
"echo Hello World > ./output"
});
python版本需要额外的引号来告诉底层系统echo Hello World > ./output
是一个参数。 java版本显式地将参数指定为单独的字符串,因此它不需要这些引号。
此外,您的版本没有投诉并且没有投诉,您只是没有看到投诉,因为您没有阅读创建过程的错误流。
答案 1 :(得分:1)
通过Process
的方法getOutputStream()
,getInputStream()
和getErrorStream()
访问从Java启动的系统进程的标准输入,输出和错误流。 / p>
我建议您获取系统进程产生的错误输出:
Process p = Runtime.getRuntime().exec(...);
InputStream input=p.getErrorStream();
do
{
n=input.read(...);
}
while (n>=0);
小心:对于你的实际问题,这就足够了。但是对于产生较长错误/输出的过程,您需要在单独的线程中执行标准错误/输出的读取。如果没有,系统进程将在错误/输出缓冲区已满时阻塞,并等待它被外部消耗,如果您将执行进程后的 >>放置在读取循环中,它将永远不会执行所以,该程序将进入死锁。