我在 Bash 脚本中有以下内容:
cmd="composer install"
`"$cmd"`
结果是:
作曲家安装:未找到命令
但是,如果我只是在同一个 bash 脚本中运行它:
composer install
它工作正常。我做错了什么?
答案1
不要引用这个变量扩展:
cmd="composer install"
$cmd
变量被扩展,并且由于没有被引用,shell 将继续将其拆分为单词,因此您执行:“composer” “install”(而不是“composer install”作为单个单词)
不要用反引号括起来。这是错误的:
`$cmd`
这将执行 composer 命令,捕获 stdout,然后尝试将输出作为命令执行。
一个需要养成的习惯是使用 bash 数组来构建命令。这是必需的,因为当命令的参数带有空格时,shell 不可能正确评估单个字符串中保存的命令。一个虚构的例子
cmd="composer install --users='fred barney'"
在这种情况下 $cmd 将扩展为4参数,而不是你可能期望的 3 个:
"composer" "install" "--users='fred" "barney'"
如果这可能会影响到你,那么数组就是最佳选择:
cmd=( composer install --users='fred barney' )
这个数组有 3 个元素。执行方式如下(虽然丑陋但正确):
"${cmd[@]}"
答案2
你可以使用函数来代替:
#!/bin/bash
function special_command {
composer install
}
special_command
您还可以通过这种方式传递变量:
#!/bin/bash
function special_ls {
ls -ld $1
}
function normal_ls {
ls $file
}
special_ls /var/tmp
file=/var/tmp
normal_ls