【发布时间】:2011-07-29 06:26:03
【问题描述】:
我想通过java在linux中运行nm命令。
我试过这段代码:
command = "nm -l file1.o > file1.txt";
Process p = Runtime.getRuntime().exec(command);
但它不起作用,代码有什么问题?
【问题讨论】:
标签: java linux command-line
我想通过java在linux中运行nm命令。
我试过这段代码:
command = "nm -l file1.o > file1.txt";
Process p = Runtime.getRuntime().exec(command);
但它不起作用,代码有什么问题?
【问题讨论】:
标签: java linux command-line
那不是可执行文件,它实际上是一个 shell 脚本。
如果你使用 -c 调用 shell,那么你可以执行你的命令:
/bin/sh -c "command > here"
【讨论】:
这是你需要做的:
String command = "nm -l file1.o > file1.txt";
Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", command});
以下“简单答案”不会工作:
String command = "/bin/sh -c 'nm -l file1.o > file1.txt'";
Process p = Runtime.getRuntime().exec(command);
因为exec(String) 方法天真地使用空格作为分隔符并忽略任何引用来拆分其字符串。所以上面的例子等价于提供下面的命令/参数列表。
new String[]{"/bin/sh", "-c", "'nm", "-l", "file1.o", ">", "file1.txt'"};
【讨论】:
管道的替代方法是读取命令的标准输出,例如,请参阅 Java exec() does not return expected result of pipes' connected commands。
而不是使用 "> file.txt" 重定向输出,您可以读取输出的任何内容并将其写入 StringBuffer 或 OutputStream 或您喜欢的任何内容。
这样做的好处是您还可以读取 stderr 并查看是否有错误(例如设备上没有剩余空间等)。 (您也可以使用您的方法使用“2>”)
【讨论】: