Java 在getRuntime().exec中使用引号

Java 在getRuntime().exec中使用引号,java,exec,runtime.exec,Java,Exec,Runtime.exec,我想使用字符串作为输入来调用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终止有关 有

我想使用字符串作为输入来调用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遇到它之前就结束了。查找没有关闭fi或完成的ifs、for等。

使用以下方法:

Runtime.getRuntime().exec(new String[] {"sh", "-l", "-c", "./foo"});
要点:不要加双引号。这只在shell中编写命令行时使用

e、 例如,
echo“Hello,world!”
(在shell中键入)被转换为:

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

(暂时忘记shell通常有一个内置的
echo
,并调用
/bin/echo
。-)

在字符串中需要转义引号。 而不是写“写”

例如


strcpy(c,“这是一个字符串”,带引号)

Windows命令行的行为不同于UNIX、Mac OS X和GNU/Linux

在Windows上,进程会在可执行文件名(和空格)后逐字接收输入文本。然后由程序来解析命令行(这通常是隐式完成的,程序员通常对这个过程一无所知)

在GNU/Linux中,shell处理命令行,保证将熟悉的字符串数组传递给C的
main
函数。你没有那个外壳。最好的方法(即使在Windows上)是使用exec的一种形式,在这种形式中,您可以在自己的
字符串中分别传递每个命令行参数

Process exec​(String[] cmdarray)    
Process exec​(String[] cmdarray, String[] envp)     
Process exec​(String[] cmdarray, String[] envp, File dir)
或更好,
java.lang.ProcessBuilder

如果你真的想要,你可以得到一个shell来帮你进行解析。这将使您的示例看起来像(未经测试):


如果我是你,我会将字符串的内容写入一个temp bash文件,看看bash是否执行该文件而没有任何错误。如果执行没有错误,那么我会考虑进一步调试; 您是在编译时还是在运行时收到错误?您用来调用bash的Java代码是什么?在Java代码中使用的字符串似乎是错误的。不幸的是,他们在帖子中丢失了,这使得它不是特别有用。。。
Runtime.getRuntime().exec(new String[] {
    "sh", "-c", "sh -l -c \"echo foo; echo bar;\""
});