【问题标题】:Run linux command through java.通过java运行linux命令。
【发布时间】: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


    【解决方案1】:

    那不是可执行文件,它实际上是一个 shell 脚本。

    如果你使用 -c 调用 shell,那么你可以执行你的命令:

    /bin/sh -c "command > here"
    

    【讨论】:

    • 感谢您的回复。但这在 ubuntu 中不起作用。我不知道为什么我使用的代码和你写的一样。
    • 是的......请参阅我的答案以获得可能的解释。
    【解决方案2】:

    这是你需要做的:

    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'"};
    

    【讨论】:

    • 我们怎样才能得到这个命令的输出?当我们使用 sh 它打开新的 shell 时,我们如何捕获命令的输出?
    【解决方案3】:

    管道的替代方法是读取命令的标准输出,例如,请参阅 Java exec() does not return expected result of pipes' connected commands

    而不是使用 "> file.txt" 重定向输出,您可以读取输出的任何内容并将其写入 StringBuffer 或 OutputStream 或您喜欢的任何内容。

    这样做的好处是您还可以读取 stderr 并查看是否有错误(例如设备上没有剩余空间等)。 (您也可以使用您的方法使用“2>”)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-07
      • 2012-07-16
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      相关资源
      最近更新 更多