請看下面的代碼:當要執行的命令存儲在bash腳本的變量中時,如何重定向輸出?
#!/bin/bash
CMD="echo hello world > /tmp/hello.out"
${CMD}
這個輸出是:
hello world > /tmp/hello.out
如何修改CMD使輸出被重定向到文件hello.out? 對於我的使用情況下,這是不可行的做這一點:
exec > /tmp/hello.out
請看下面的代碼:當要執行的命令存儲在bash腳本的變量中時,如何重定向輸出?
#!/bin/bash
CMD="echo hello world > /tmp/hello.out"
${CMD}
這個輸出是:
hello world > /tmp/hello.out
如何修改CMD使輸出被重定向到文件hello.out? 對於我的使用情況下,這是不可行的做這一點:
exec > /tmp/hello.out
不,沒有辦法使重定向發生在變量中。
爲什麼?
殼確實使用命令行的第一件事是:
每一行,該外殼從標準輸入讀取或腳本被稱爲管道;它包含一個或多個由零或 多個管道字符(|)分隔的命令。對於每個管道它讀取,殼其分成命令,建立用於管道中的I/O,則確實爲每個命令(圖7-1)下面:
來自:Learning the bash Shell Unix Shell Programming。 Chapter Preview/Figure。 Pdf
這意味着即使在開始使用命令行的第一個單詞之前,也會設置重定向。
「參數展開」發生在後期(圖中的第6步)。
擴展變量後無法設置重定向。
除非......
的 「命令行再加工」 使用eval。
eval "$CMD"
但是這帶來了很多危險。
通過本書中詳細介紹的12個步驟(引號被刪除,變量擴展,單詞分割等)的第一個處理,命令行被更改。
在實際處理行之前,通常很難估計所有更改和後果。
然後,再次處理。
您可以用eval指示shell重新詮釋:
${CMD} > /tmp/hello.out
,或者在腳本的頂部添加此可變內容作爲shell命令:
eval $CMD
謝謝,從理論上講,沒有什麼我可以做的CMD的內容,這種重定向發生。考慮一下我無法修改bash腳本的情況,只能控制CMD var - 通過作爲env var傳遞,例如 – AnkurVj
否,那是不可能的。shell必須重新解釋變量,唯一的方法是使用'eval'命令。你可以做的唯一的事情就是放入'$ CMD'中的其他一些腳本,它將通過重定向執行命令。 –
這應該幾乎可以肯定是'eval「$ CMD」'(否則最終可能會出現glob擴展等等),它需要帶有健康警告。 – rici