2013-12-20 52 views
1

這確實很簡單,但我似乎無法弄清楚。任何想法當我通過變量執行相同的命令有什麼錯誤?基於代碼的變數

這個工程:

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

但這並不:

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

任何想法?

回答

1

我沒有確切的理由在我的指尖,但是...你不能那樣做。

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

然而,eval將做的工作:

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

您的代碼:

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

是等價的:

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

由於管道字符是一個變量裏面,它不會被評估爲shell元字符,它的效果與在comm上鍵入它相同並用引號或反斜線來轉義它。這種情況很容易看到,如果你用這個來代替:

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

由於已經發布,答案是使用「EVAL」這樣的外殼擴展變量,然後試圖執行它作爲殼源,然後像元字符管道將被識別。