在 getRuntime().exec 中使用 Quotes

2022-09-01 16:37:19

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


答案 1

使用这个:

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

要点:不要把双引号放进去。这仅在 shell 中编写命令行时使用!

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

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

(暂时忘记 shell 通常有一个内置的 ,而是在调用。echo/bin/echo


答案 2

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

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

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

Process exec​(String[] cmdarray)    
Process exec​(String[] cmdarray, String[] envp)     
Process exec​(String[] cmdarray, String[] envp, File dir)

或者更好的是java.lang.ProcessBuilder

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

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

推荐