我想用一个字符串作为输入调用的bash。 就像是:
sh -l -c "./foo"
我想从Java做到这一点。 不幸的是,当我尝试调用使用命令getRuntime().exec
我得到以下错误:
foo": -c: line 0: unexpected EOF while looking for matching `"'
foo": -c: line 1: syntax error: unexpected end of file
这似乎是与我的字符串而终止与EOF。
有没有插入特定于平台的EOF到Java字符串的方法吗? 或者我应该寻找另一种方法,就像调用“sh”的前写一个临时脚本?
用这个:
Runtime.getRuntime().exec(new String[] {"sh", "-l", "-c", "./foo"});
要点:写在shell命令行的时候不要把双引号,这只是使用!
例如, echo "Hello, world!"
(如外壳类型)被翻译为:
Runtime.getRuntime().exec(new String[] {"echo", "Hello, world!"});
(只是忘记的是,外壳通常有一个内置的时刻echo
,并呼吁/bin/echo
来代替。:-))
不同于UNIX,Mac OS X和GNU / Linux的Windows命令行。
在Windows的过程中接收的输入文本是executeable名称(空间)之后。 它然后由程序来解析命令行(这通常是隐式完成,程序员往往是无能)。
在GNU / Linux的壳处理命令行和gnereates传递至C的主弦的熟悉阵列。 你没有那个壳。 最好的办法(甚至在Windows上)是你在自己的字符串单独通过每个命令行参数使用EXEC的形式。
你可以得到一个shell来解析你,如果你真的想要的。 这将使你例子看起来像(未经测试):
Runtime.getRuntime().exec(new String[] {
"sh", "-c", "sh -l -c \"echo foo; echo bar;\""
});
EOF不是一个字符,所以没有办法写一个EOF。 你忘了收带引号的字符串。
此错误的原因是最有可能缺少语法令牌bash的希望,但你传递结束前的bash遇到它的字符串。 寻找IFS,维权等有没有结束Fi或完成。
行情需要在字符串中进行时,逃过一劫。 而不是写“写\”。
如
的strcpy(C, “这是一个字符串\” 以\ “报价”);
如果我是你,我会写字符串到一个临时bashfile的内容,看看是否bash的执行,没有任何错误。 如果没有错误执行,那么我会考虑进一步调试;