Java 在getRuntime().exec中使用引号
我想使用字符串作为输入来调用bash。比如: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终止有关 有
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;\""
});