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

Interesting Posts