将string转换为CLI指令

我有一个bash脚本中的以下内容:

cmd="composer install" `"$cmd"` 

这导致:

composer php安装:找不到命令

但是,如果我只是在相同的bash脚本中运行这个:

 composer install 

它工作没有问题。 我究竟做错了什么?

不要引用这个variables扩展:

 cmd="composer install" $cmd 

这个variables是扩展的,因为它没有被引用,shell将继续将它分解成单词,所以你可以执行:“composer”“install”(而不是“composer install”作为一个单词)


不要用反引号包起来。 这是错误的:

 `$cmd` 

这将执行composer命令,捕获stdout,然后尝试执行输出作为命令


一个习惯是使用bash数组来build立命令。 这是必需的,因为当命令带有空白参数时,shell不可能正确评估单个string中保存的命令。 一个虚构的例子

 cmd="composer install --users='fred barney'" 

在这种情况下,$ cmd将扩展为4个参数,而不是您可能期望的3个:

 "composer" "install" "--users='fred" "barney'" 

如果这可能会影响到你,数组就是要走的路:

 cmd=( composer install --users='fred barney' ) 

这个数组有3个元素。 这样执行的方式(丑陋但是正确):

 "${cmd[@]}" 

你可以使用函数来代替:

 #!/bin/bash function special_command { composer install } special_command 

你也可以这样传递variables:

 #!/bin/bash function special_ls { ls -ld $1 } function normal_ls { ls $file } special_ls /var/tmp file=/var/tmp normal_ls