基于波形的exec来自变量

时间:2013-12-20 01:30:59

标签: bash

这肯定很简单,但我似乎无法弄明白。当我通过变量执行相同的命令时,知道什么是错的吗?

这有效:

$ echo `git --version | cut -d' ' -f3`
1.8.4

但这不是:

$ c="git --version | cut -d' ' -f3"
$ echo  `$c`
git version 1.8.4

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您的代码:

c="git --version | cut -d' ' -f3"
echo  `$c`

相当于:

git --version "|" cut -d' ' -f3

由于管道字符位于变量内部,因此它不会被评估为shell元字符,并且其效果与在命令行上使用引号或反斜杠键入它以使其转义相同。如果您使用此代码,则更容易看到:

c="echo a b c | wc -w"
echo `$c`

如上所述,答案是使用“eval”,以便shell扩展变量然后尝试将其作为shell源执行,然后将识别管道之类的元字符。

答案 1 :(得分:1)

我没有确切的理由触手可及,但是......你不能这样做。

管道和重定向似乎特别特别。

但是,eval将完成这项工作:

$ c="git --version | cut -d' ' -f3"
$ eval "$c"
1.7.5.4