且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何执行存储在变量中的命令?

更新时间:2023-10-17 15:30:16

Unix Shell在执行每行输入之前对它们进行一系列转换。对于大多数shell,它看起来像这样(取自Bash man page):

  • 初始分词
  • 花括号扩展
  • 波浪号扩展
  • 参数、变量、算术展开
  • 命令替换
  • 二级分词
  • 路径扩展(也称为全局绑定)
  • 删除引号

使用$cmd会在参数扩展阶段将其直接替换为您的命令,然后进行以下所有转换。

使用eval "$cmd"在引号删除阶段之前不执行任何操作,在此阶段$cmd按原样返回,并作为参数传递给eval,其功能是在执行之前再次运行整个链。

因此,基本上,它们在大多数情况下是相同的,当您的命令利用转换步骤扩展参数时,它们是不同的。例如,使用大括号扩展:
$ cmd="echo foo{bar,baz}"

$ $cmd
foo{bar,baz}

$ eval "$cmd"
foobar foobaz