Bash - 将参数视为命令参数

时间:2018-03-08 07:11:42

标签: java bash

我知道,我们可以使用-c参数在BASH中执行命令:

bash --login -c "command parameter"

由于我们需要能够以编程方式(来自Java)执行带有任意参数(可包含空格,引号或撇号)的任何命令,我们希望BASH将所有参数视为命令,像--这样的东西通常用来将文件名中的选项分开,例如与Git。有没有办法执行类似于

的上述调用
bash --login -<some option> -- command parameter

可以很容易地从Java执行而无需转义命令或参数吗?

new ProcessBuilder(new String[] {
  "bash",
  "--login",
  "-<some option>",
  "--"
  command,
  parameter
}).start();

1 个答案:

答案 0 :(得分:2)

-c command必须是bash的最后一个选项参数。任何后续参数,无论它们是否以短划线开头,都会分配给执行命令的shell中的位置参数$0$1,....

这通常很方便,因为它允许您将字符串替换为正在执行的命令,而不必担心引用它们。

由于命令后面的第一个参数被分配给$0,所以很常见的是看到像

这样的调用
bash -c 'complicated command using "$@"' _ arg1 arg2 arg3

以便将arg1分配给$1(例如,允许"$@"按预期工作)。

举个例子:

new ProcessBuilder( new String[] {
  "bash",
  "--login",
  "-<some option>",
  "-c",
  "for arg in \"$@\"; do frobnicate \"$arg\" 42; done",
  "_",
  "first thing to frobnicate",
  "second thing", ...
}).start();