Как запустить команду hg clone в оболочке xterm из java-приложения?

Я хочу, чтобы мое приложение запускало оболочку xterm и запускало команду «hg clone». Я не могу понять, почему одна и та же команда отлично работает, когда я набираю ее непосредственно в xterm, и не работает, когда моя программа использует:

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

где команда:

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

xterm открывается, и я получаю:

xterm: Не удается выполнить execvp: "hg: Нет такого файла или каталога

Не могли бы вы мне помочь, пожалуйста?


person Peters_    schedule 18.06.2013    source источник


Ответы (1)


Короткий ответ: 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 для "разбора" строки командной строки. Он просто разбивается на кратные одному или нескольким пробельным символам... обрабатывает любые встроенные кавычки и другие метасимволы оболочки как данные.

Решение состоит в том, чтобы выполнить разделение команды/аргумента самостоятельно; например

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> программы, которую он не может запустить.

person Stephen C    schedule 18.06.2013