2016-11-04 30 views

回答

2

不,沒有辦法使重定向發生在變量中。

爲什麼?

殼確實使用命令行的第一件事是:

每一行,該外殼從標準輸入讀取或腳本被稱爲管道;它包含一個或多個由零或 多個管道字符(|)分隔的命令。對於每個管道它讀取,殼其分成命令,建立用於管道中的I/O,則確實爲每個命令(圖7-1)下面:

來自:Learning the bash Shell Unix Shell ProgrammingChapter Preview/FigurePdf

這意味着即使在開始使用命令行的第一個單詞之前,也會設置重定向。
「參數展開」發生在後期(圖中的第6步)。

擴展變量後無法設置重定向。

除非......

的 「命令行再加工」 使用eval。

eval "$CMD" 

但是這帶來了很多危險。
通過本書中詳細介紹的12個步驟(引號被刪除,變量擴展,單詞分割等)的第一個處理,命令行被更改。

在實際處理行之前,通常很難估計所有更改和後果。

然後,再次處理

0

您可以用eval指示shell重新詮釋:

${CMD} > /tmp/hello.out

,或者在腳本的頂部添加此可變內容作爲shell命令:

eval $CMD 
+0

謝謝,從理論上講,沒有什麼我可以做的CMD的內容,這種重定向發生。考慮一下我無法修改bash腳本的情況,只能控制CMD var - 通過作爲env var傳遞,例如 – AnkurVj

+0

否,那是不可能的。shell必須重新解釋變量,唯一的方法是使用'eval'命令。你可以做的唯一的事情就是放入'$ CMD'中的其他一些腳本,它將通過重定向執行命令。 –

+3

這應該幾乎可以肯定是'eval「$ CMD」'(否則最終可能會出現glob擴展等等),它需要帶有健康警告。 – rici

相關問題