2 回答

TA贡献1777条经验 获得超3个赞
exec
不是一个完整的外壳。
为方便起见,它确实允许您传递带有可执行文件名称和参数的单个字符串(与使用版本相反String[]
),但它用于拆分该字符串的逻辑非常简单,它只是调用new StringTokenizer(command)
,它只是拆分为空格,并且不了解完整命令 shell 会提供的特殊引用和转义行为。
所以你的单引号没有被尊重。
gvim /etc/fstab '+normal GW' // last quoted section supposed to be a single arg
成为
String[]{ "gvim", "/etc/fstab", "'+normal", "GW'" } // four args instead of three
如何从 Java 中将上述命令作为单个字符串调用?
你真的需要这个吗?除非应用程序动态地接受来自交互式用户的命令行输入,否则应该可以在编写程序时拆分参数。那样安全多了。
如果你真的需要这个,你可以将整个字符串传递给命令 shell。
尝试 Runtime.getRuntime().exec(new String[]{"bash", "-c", theCommand });
但是涉及一些开销。
除此之外,您可以尝试找到一个可以“正确”拆分字符串的 Java 库。

TA贡献1829条经验 获得超9个赞
根据文档exec(String command)
将整个字符串视为命令,如果我们查看文档
public Process exec(String command) throws IOException
在单独的进程中执行指定的字符串命令。
这是一个方便的方法。exec(command) 形式的调用与调用 exec(command, null, null) 的行为方式完全相同。
参数:
command - 指定的系统命令。
来到exec(String[] cmdarray)
它会将 cmdarray 视为包含要调用的命令及其参数的数组。这是这两种方法之间的唯一区别,这可能是问题所在
public Process exec(String[] cmdarray) throws IOException
在单独的进程中执行指定的命令和参数。
这是一个方便的方法。exec(cmdarray) 形式的调用与调用 exec(cmdarray, null, null) 的行为方式完全相同。
参数:
cmdarray - 包含要调用的命令及其参数的数组。
添加回答
举报