【问题标题】:Is there any difference between java run.exec of a command and shell execution?命令的 java run.exec 和 shell 执行之间有什么区别吗?
【发布时间】:2010-12-16 13:22:07
【问题描述】:

我有一个调用 shell 命令的程序。当我使用 java 的 run.exec 执行命令时,它不起作用,但是当我直接在终端中执行命令时,它就像魅力一样工作。

ex: pdf2swf "3bbba47.pdf" -T 9 -o "3bbba47.swf" didnt worked
    from java program but worked directly executing it in terminal.

但是当我尝试从命令中删除引号时

pdf2swf 3bbba47.pdf -T 9 -o 3bbba47.swf

它在 run.exec 和终端都运行良好。

为什么会这样?

我在 mac 和 ubuntu 中都试过,结果相同。

【问题讨论】:

    标签: java linux shell command pdf2swf


    【解决方案1】:

    发件人:http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1

    Runtime.exec() 不是命令行

    最后一个陷阱 Runtime.exec() 错误地假设 那 exec() 接受任何字符串 您的命令行(或外壳)接受。 Runtime.exec() 受到更多限制 而不是跨平台。这个陷阱 是由于用户试图使用 exec() 方法接受单个 作为命令行的字符串。这 混淆可能是由于以下事实 command 是参数名 exec() 方法。于是,程序员 错误地关联参数 指挥他或她的任何事情 可以在命令行上键入,而不是 将其与单个程序相关联 及其论点。

    【讨论】:

      【解决方案2】:

      run.exec() 不调用 shell。 shell 解析命令行并在将引号作为参数传递给 pdf2swf 之前有效地删除它们。您只能使用 run.exec() 运行“原始”命令。

      如果需要,您可以使用 run.exec() 运行 shell,并让它将您的命令解析为 shell 命令。引用会有点痛苦,但可行。

      【讨论】:

        【解决方案3】:

        当您在 shell 中时,引号字符在 shell 将其提供给 JVM 之前被解释。

        当您在 run.exec 中时,引号被认为是命令的一部分,因此 JVM 认为您请求的是 ["3bbba47.pdf"] 而不是 [3bbba47.pdf]

        【讨论】:

          猜你喜欢
          • 2014-11-12
          • 2013-08-11
          • 1970-01-01
          • 1970-01-01
          • 2021-01-27
          • 1970-01-01
          • 1970-01-01
          • 2014-09-30
          • 2019-08-29
          相关资源
          最近更新 更多