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

时间:2015-11-29 15:26:02

标签: java bash shell escaping

我有一个数组格式的命令,我可以传递给execve()。例如,命令是:

echo "It's Nice"

我拥有的数组是["echo","It's Nice"]。我试图将这个数组转换成一个我可以用bash编写并正确执行的字符串。我显然无法使用空格分隔符加入此数组,因为我会得到:echo It's Nice,因为它有一个未终止的单引号而无法运行。

是否有BKM将其转换为可运行的字符串?也许是一个已经用Java做过的库?当命令有许多特殊字符应该被转义\引用以便正常运行时,它会变得棘手。

编辑: 我想让我的问题更清楚。用户给我作为字符串数组的命令,我执行它,一切正常。现在我需要向用户报告我的运行情况。我不想将命令显示为数组,而是希望将其显示为字符串,用户可以简单地将其复制并粘贴到他的bash shell并执行它,如果他愿意的话。所以我的输入是[echo, It's Nice],我的输出应该是echo "It's Nice"。这似乎是一个简单的函数,但是我不确定我是否在考虑所有的结尾情况(比如字符串是否有引用或shell操作的其他特殊字符)。我想知道可能已经有一些代码已经完成,并涵盖了我尚未考虑的最终案例。

2 个答案:

答案 0 :(得分:0)

您不需要将数组转换为字符串,您可以使用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

答案 1 :(得分:0)

在Java 8中很容易做到:

 var array = [1,2,3]
 array.insert(0, at: 0)
 print(array)
 // 0,1,2,3