如何在bash -c中运行任意命令?

时间:2018-11-07 19:11:23

标签: bash shell

我基本上想做bash -c "$@",但这不起作用(我的命令无法运行)。 eval "$@"工作正常,有什么区别?

我想做这样的事情:

myscript:

function run_it() {
  bash -c "$@"
}

run_it $@


./myscript MY_VAR=5 make my-target

1 个答案:

答案 0 :(得分:0)

这是因为报价。这样应该可以更好地工作:

function run_it() {
  bash -c "$*"  # Change 1
}

run_it "$@"     # Change 2

更改原因1:$@在引号内使用时很特殊,例如"$@"。它没有扩展为单个参数,而是扩展为一系列带引号的参数:"MY_VAR=5" "make" "my-target"。结果,-c标志仅接收MY_VAR=5部分,该部分分别以makemy-target作为参数$0$1执行。通过使用"$*",您 do 最终得到一个字符串。注意,这仍然不能正确处理空格。不知道如何解决这个问题。

更改原因2:在这里,我们要做希望每个参数都单独引用。这样可以确保不会很快分裂参数。除非先解决其他空格问题,否则可能没有意义。