0

我希望我的应用程序运行 xterm shell 并运行命令“hg clone”。我不明白为什么当我直接将它输入到 xterm 时,相同的命令可以完美运行,而当我的程序使用时它不起作用:

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

其中命令是:

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

xterm 打开,我得到:

xterm:无法执行vp:“hg:没有这样的文件或目录

请问你能帮帮我吗?

4

1 回答 1

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)使用了一种简单的方案来“解析”命令行字符串。它只是拆分一个或多个空白字符的倍数...将任何嵌入的引号和其他 shell 元字符视为数据

解决方案是自己进行命令/参数拆分;例如

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. 无论哪种方式,尝试理解错误消息都是一个好主意。在这种情况下,错误消息清楚地告诉您它无法运行该程序......并且它告诉您它无法运行的程序的名称

于 2013-06-18T09:34:59.060 回答