2017-06-25 71 views
0

我正在編寫一個腳本,其中一部分不能按我所期望的那樣工作。 我有一個簡單的例子,爆發這部分簡單bash:執行存儲在變量中的命令

echo 'echo "" > tmp' | while read cmd; do $cmd ; done 

在這裏我希望完整的命令,「回聲‘’> TMP」到由$ CMD執行。 但是,什麼情況是這個

"" > tmp 

命令執行的呼應了 「」> TMP literaly。而不是回顯「」並將其重定向到文件tmp。 將命令存儲在$ cmd中,然後嘗試執行它時,顯然有些問題。

的結果是一樣的,即使我把它簡化進一步

cmd="echo "" > tmp" 
$cmd 
> tmp 

我試圖用「」和「」不同的用途進行試驗,但沒有解決它。

+4

請仔細閱讀http://mywiki.wooledge.org/BashFAQ/050 –

回答

1

eval使用執行存儲在變量中的命令:

echo 'echo "" > tmp' | while read cmd; do eval "$cmd" ; done 

cmd值將是echo "" > tmp。然後,當Bash將參數替換解析爲命令時,部分"" > tmp將是echo的字符串參數,不會被識別爲>(重定向)。所以它只會輸出參數部分。

的一樣:$(echo 'echo "" > tmp')

+2

警告:'eval'有作爲臭蟲磁鐵的當之無愧的聲譽。當你測試它時,它往往工作得很好,但是當你在真實數據上運行它時偶爾會產生奇怪的結果。根據我的經驗,如果'eval'看起來像答案,通常意味着你問的是錯誤的問題,真的應該備份並尋找一種不同的方法來解決你想要解決的潛在問題。 –

+0

參見[BashFAQ#48](http://mywiki.wooledge.org/BashFAQ/048)。 –

0

變化

do $cmd ; 

do eval "$cmd" ; 
+3

在zhenguoli的回答下查看我的評論。另外,如果你必須使用'eval',那麼至少應該雙引號來避免一些*真正*奇怪的錯誤。 –

+0

@GordonDavisson點指出..是雙引號,以防止分詞主要在這裏... – sjsam