Java:将命令数组转换为可以在bash中执行的字符串



我有一个数组格式的命令,可以将其传递给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);

最新更新