我知道,我们可以使用-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();
答案 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();