我希望我的应用程序运行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:没有这样的文件或目录
请问你能帮帮我吗?
答案 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,没有这样的文件或目录”
该程序是“xterm”,而不是“x-term”。 (你设法在......之前得到它)
如果这不是问题,请尝试使用程序的绝对路径名。
无论哪种方式,尝试理解错误消息都是个好主意。在这种情况下,错误消息明白告诉您无法运行程序...并且告诉您名称< / em>无法运行的程序。