如何执行存储在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键的话)