内getRuntime()使用行情。EXEC(Using Quotes within get

2019-09-01 00:18发布

我想用一个字符串作为输入调用的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”的前写一个临时脚本?

Answer 1:

用这个:

Runtime.getRuntime().exec(new String[] {"sh", "-l", "-c", "./foo"});

要点:写在shell命令行的时候不要把双引号,这只是使用!

例如, echo "Hello, world!" (如外壳类型)被翻译为:

Runtime.getRuntime().exec(new String[] {"echo", "Hello, world!"});

(只是忘记的是,外壳通常有一个内置的时刻echo ,并呼吁/bin/echo来代替。:-))



Answer 2:

不同于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;\""
});


Answer 3:

EOF不是一个字符,所以没有办法写一个EOF。 你忘了收带引号的字符串。



Answer 4:

此错误的原因是最有可能缺少语法令牌bash的希望,但你传递结束前的bash遇到它的字符串。 寻找IFS,维权等有没有结束Fi或完成。



Answer 5:

行情需要在字符串中进行时,逃过一劫。 而不是写“写\”。

的strcpy(C, “这是一个字符串\” 以\ “报价”);



Answer 6:

如果我是你,我会写字符串到一个临时bashfile的内容,看看是否bash的执行,没有任何错误。 如果没有错误执行,那么我会考虑进一步调试;



文章来源: Using Quotes within getRuntime().exec