我有一个数组格式的命令,可以将其传递给execve()。例如,命令为:
echo "It's Nice"
并且我所具有的阵列是CCD_ 1。我正试图将这个数组转换为一个字符串,以便在bash中编写并正确执行。很明显,我不能使用空格分隔符加入这个数组,因为我会得到:echo It's Nice
,因为它有一个未终止的单引号,所以无法运行。
是否有BKM将其转换为可运行的字符串?也许是一个已经在Java中这样做的库?如果命令中有许多特殊字符,为了正确运行,这些字符应该转义\引用,这可能会变得很棘手。
编辑:我想让我的问题更清楚一些。用户将他的命令作为字符串数组提供给我,我执行它,一切都很好。现在我需要向用户报告我运行的内容。我不想把命令显示为数组,相反,我想把它显示为一个字符串,用户可以简单地复制并粘贴到他的bash shell中,如果他愿意的话就执行它。所以我的输入是[echo, It's Nice]
,输出应该是echo "It's Nice"
。这似乎是一个简单的函数,但我不确定我是否考虑了这里的所有结束情况(比如字符串是否有引号或shell操纵的其他特殊字符)。我想知道也许有一些代码已经做到了这一点,并涵盖了我尚未考虑的最终情况。
您不需要将数组转换为字符串,可以使用ProcessBuilder
:直接执行命令
String runShell(final String[] commandArgs) {
try {
final ProcessBuilder processBuilder = new ProcessBuilder(commandArgs);
processBuilder.redirectErrorStream(true); // merge stderr with stdout
Process process = processBuilder.start();
ret = process.waitFor();
BufferedReader br = new BufferedReader(new InputStreamReader(
process.getInputStream() ));
br.lines().forEach(System.out::println); // print stdout + stderr
process.destroy();
br.close();
}
catch (IOException|InterruptedException e) {
e.printStackTrace();
}
return commandArgs[0] + Arrays.asList(commandArgs).stream()
.skip(1)
.collect(Collectors.joining("" "", " "", """));
}
并称之为:
runShell(new String[] {"pwd"}); // print current working directory
runShell(new String[] {"ls", "-l"}); // list all the files and directories
runShell(new String[] {"echo", "It's Nice"}); // echo something
这在Java 8:中很容易做到
String joined = String.join(" ", iteratable);