在getRuntime()。exec中使用引号

时间:2020-03-06 15:01:17  来源:igfitidea点击:

我想使用字符串作为输入来调用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"之前写入临时脚本?

解决方案

EOF不是字符,因此无法编写EOF。
我们忘记了关闭带引号的字符串。

导致此错误的原因很可能是bash期望缺少语法标记,但是我们传递的字符串在bash遇到它之前结束。查找没有结束或者完成的if,fors等。

用这个:

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

要点:不要在双引号中使用。仅在外壳中编写命令行时使用!

例如," echo" Hello,world!"`(在shell中键入)被翻译为:

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

(请暂时忘记外壳程序通常具有echo的内建函数,而是调用/ bin / echo。:-))

字符串中的引号需要转义。
而不是写"写"。

例如。

strcpy(c,"这是一个字符串"带有"引号");

Windows命令行不同于UNIX,Mac OS X和GNU / Linux。

在Windows上,该过程按可执行名称(和空格)后的原样接收输入文本。然后由程序来解析命令行(这通常是隐式完成的,程序员通常很笨拙)。

在GNU / Linux中,外壳程序处理命令行,并对传递给C主程序的熟悉的字符串数组进行处理。我们没有那个外壳。最好的方法(即使在Windows上也是如此)是使用exec的形式,在该形式中,每个命令行参数分别在其自己的String中传递。

如果我们确实需要,可以为我们提供shell来进行解析。这会使示例看起来像(未经测试):

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

如果我们是我,我会将字符串的内容写入临时bashfile,然后查看bash是否能够正确执行该内容。如果执行没有错误,那么我将考虑进一步调试。