如何执行存储在variables中的命令?
 调用一些存储在variables中的命令的正确方法是什么? 
  1和2之间有什么区别? 
#!/bin/sh cmd="ls -la $APPROOTDIR | grep exception" #1 $cmd #2 eval "$cmd"  在执行它们之前,Unix shell对每一行input进行一系列转换。 对于大多数shell来说,它看起来像这样(从bash manpage中获取): 
- 最初的词分裂
- 大括号扩展
- 波浪扩张
- 参数,variables和算术扩展
- 命令replace
- 二次分词
- path扩展(又名globbing)
- 报价清除
 直接使用$cmd可以在参数展开阶段将其replace为您的命令,然后进行以下所有转换。 
 使用eval "$cmd"直到报价清除阶段,其中$cmd按原样返回,并作为parameter passing给eval , eval的function是在执行之前再次运行整个链。 
所以基本上,在大多数情况下它们是相同的,而且当您的命令使用到参数扩展的转换步骤时会有所不同。 例如,使用大括号扩展:
 $ cmd="echo foo{bar,baz}" $ $cmd foo{bar,baz} $ eval "$cmd" foobar foobaz 
 如果您只是在执行cmd="ls -l" (交互式和脚本)时执行eval $cmd ,我们就可以得到所需的结果。 在你的情况下,你有一个没有模式的grep的pipe道,所以grep部分将失败并带有错误消息。 只要$cmd将产生一个“找不到命令”(或一些这样的)消息。 因此,请尝试使用eval并使用完成的命令,而不是生成错误消息的命令。 
我想宇把符号放在你的variables(如果按下了Shift键的话)