[英]How to use Runtime.exec() with backslash?
我尝试从Java的分离屏幕启动Shell脚本。
Runtime.getRuntime().exec("screen -S " + code + " -X stuff \"bash start.sh $(printf \\\\r)\"");
我认为"
被替换为\\"
和\\
用\\\\
。
应该执行的普通代码是
screen -S VMD54 -X stuff "bash start.sh $(printf \\r)"
从分离的屏幕(例如VMD54 (字符串代码))开始start.sh 。
我的代码有什么问题? 屏幕VMD54没有任何反应 。
使用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解释器。 要产生回车符,您应该在Java中使用\\r
String[] arguments = { "screen", "-S", code, "-X", "stuff", "bash start.sh \r" };
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.