Как использовать Runtime.exec () с обратной косой чертой? - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь запустить скрипт оболочки с отдельного экрана в Java.

Runtime.getRuntime().exec("screen -S " + code + " -X stuff \"bash start.sh $(printf \\\\r)\"");

Я думаю, что " заменяется на \" и \ на \\.

Обычный код, который должен быть выполнен:

screen -S VMD54 -X stuff "bash start.sh $(printf \\r)"

, который запускается start.sh с отдельного экрана, например, VMD54 (строковый код).

Что не так с моим кодом?На экране ничего не происходит VMD54 .

1 Ответ

0 голосов
/ 01 января 2019

Лучше использовать ProcessBuilder, чем exec.В любом случае, используйте версию, которая использует отдельные параметры.Это связано с тем, что версия, использующая одну длинную строку, не разбивает эту строку так, как вы думаете - она ​​в основном просто разбивает ее на пробелы и игнорирует кавычки, передавая их как часть команды.

Когда вы это делаетеВы должны учитывать, что то, что вы пишете в командной строке, не то, что процесс фактически получает в конце.Интерпретатор командной строки - bash в вашем случае - делает несколько вещей.Это расширяет материал, который начинается с $.Он удаляет кавычки, но рассматривает все внутри них как один параметр.Поэтому, когда у вас есть команда:

screen -S VMD54 -X stuff "bash start.sh $(printf \\r)"

То, что делает bash, разбивает его на слова, удаляя кавычки (кавычки отмечают, что вся вещь bash start.sh... является одним «словом»).

 screen
 -S
 VMD54
 -X
 stuff
 bash start.sh $(printf \\r)

Затем интерпретируйте команды $ внутри разделенных слов

 screen
 -S
 VMD54
 -X
 stuff
 bash start.sh ␍

Он создает процесс и передает эти шесть параметров.И вы должны делать то же самое в Java, потому что в Java нет встроенного интерпретатора bash.Чтобы создать символ возврата каретки, вы должны просто использовать \r в Java

String[] arguments = { "screen", "-S", code, "-X", "stuff", "bash start.sh \r" };
...