如何在java应用程序的xterm shell中运行“hg clone”命令?

时间:2013-06-18 09:07:12

标签: java process mercurial xterm

我希望我的应用程序运行xterm shell并运行命令“hg clone”。当我直接输入xterm时,我无法理解为什么同一个命令工作正常,并且在我的程序使用时不起作用:

Process p = Runtime.getRuntime().exec(command);

其中命令是:

"xterm -e " + "'hg --debug -v clone ssh://" + host + "/ "+ src + " " + dst + " ; read ;'"

xterm打开,我得到:

xterm:不能execvp:“hg:没有这样的文件或目录

请问你能帮帮我吗?

1 个答案:

答案 0 :(得分:2)

简短的回答是exec(String)不理解引号。

你的表达:

"xterm -e " + "'hg --debug -v clone ssh://" + host + "/ " + 
        src + " " + dst + " ; read ;'"

会给你一个像这样的字符串:

"xterm -e 'hg --debug -v clone ssh://host/src dst; read ;'"

这将被分成一个与此相当的命令和参数:

new String[] {"xterm", "-e", "'hg", "--debug", "-v", "clone",
 "ssh://host/src", "dst;", "read", ";'"}

......这是垃圾。 (它告诉xterm运行'hg命令!)

问题是exec(String)使用 niave 方案来“解析”命令行字符串。它只是拆分一个或多个空格字符的倍数... 将任何嵌入的引号和其他shell元字符视为数据

解决方案是自己执行命令/参数拆分; e.g。

Process p = Runtime.getRuntime().exec(new String[]{
        "xterm",
        "-e",
        "'hg --debug -v clone ssh://" + host + "/ " + 
                src + " " + dst + " ; read ;'"});

  

现在我收到错误“无法运行程序”x-term“:错误= 2,没有这样的文件或目录”

  1. 该程序是“xterm”,而不是“x-term”。 (你设法在......之前得到它)

  2. 如果这不是问题,请尝试使用程序的绝对路径名。

  3. 无论哪种方式,尝试理解错误消息都是个好主意。在这种情况下,错误消息明白告诉您无法运行程序...并且告诉名称< / em>无法运行的程序。