我有一个数组格式的命令,我可以传递给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操作的其他特殊字符)。我想知道可能已经有一些代码已经完成,并涵盖了我尚未考虑的最终案例。
答案 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