我有一个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