Лучше использовать 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" };