2017-06-11 39 views
0

這是對In a shell script: echo shell commands as they are executed問題的擴展。因此,我們通過使用set -v(對於擴展之前的詳細信息)或set -x(對於xtrace,在擴展之後)使用我們的命令行echo'd;或兩個set -vx。大。在shell腳本中:在執行echo命令時重定向它們

我的問題是:我們如何重定向這些echo'd行(例如文件)?

如果我運行下面的線,

BLA='xyz' 
set -v 
echo $BLA > bla.log 

,顯然,bla.log將包含 'xyz',而不是回聲 'echo $BLA > bla.log'。

我顯然需要更好地瞭解shell,以瞭解這裏發生了什麼;除了'howto redirect'解決方案之外,還將非常感謝更深入的解釋。

由於

回答

2

要將X跟蹤輸出發送到的地方不是標準錯誤一樣,您可以設置BASH_XTRACEFD到一個打開的文件描述符的數量。例如。這將直接X跟蹤輸出到一個名爲xtrace文件:

$ exec 19>xtrace; BASH_XTRACEFD=19; set -x 

(我把19的帽子,你可以使用任何FD號,只要它不是用來做別的事情)

+1

在'慶典'4.1或更高版本,您可以讓shell爲您選擇一個未使用的描述符:'exec {foo}> xtrace; BASH_XTRACEFD = $ foo的;設置-x'。從'bash' 4.3開始,你可以縮短到'exec {BASH_XTRACEFD}> xtrace;設置-x'。 (無論如何,'BASH_XTRACEFD'需要4.1。) – chepner

1

文本打印成的set -xset -v結果被寫入到stderr。如果你希望所有的輸出爲bla.log,只是做:

exec > bla.log 2>&1 
set -v 
echo bla