我有一个调用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中都尝试过,并以相同的结果结束。
答案 0 :(得分:2)
run.exec()不会调用shell。 shell解析命令行并在将它们作为参数传递给pdf2swf之前有效地删除引号。您只能使用run.exec()运行“原始”命令。
如果需要,您可以使用run.exec()运行 shell ,并将其作为shell命令解析。引用会有点痛苦,但可行。
答案 1 :(得分:1)
当你在shell中时,在shell将它提供给JVM之前解释引号字符。
当你在run.exec时,引号被认为是命令的一部分,所以JVM认为你要求[“3bbba47.pdf”]而不是[3bbba47.pdf]
答案 2 :(得分:0)
来自:http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1
Runtime.exec()不是命令行
最后一个陷阱 Runtime.exec()错误地假设 exec()接受任何String 您的命令行(或shell)接受。 Runtime.exec()更受限制 而不是跨平台。这个陷阱 是由试图使用的用户引起的 exec()方法接受单个 字符串作为命令行会。该 混淆可能是由于这一事实 command是的参数名称 exec()方法。因此,程序员 错误地关联参数 用他或她的任何东西命令 可以在命令行上键入,而不是 将它与单个程序相关联 及其论点。