将字符串转换为 CLI 指令

将字符串转换为 CLI 指令

我在 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

相关内容