2011-07-25 42 views
3

我需要在bash腳本中執行命令(在freebsd6上),並且我需要將命令的stderr和stdout發送到控制檯,日誌文件和AND到bash變量。如何將stderr和stout重定向到多個位置?

所以,沒有任何重定向,我要的是:

result=`./command | tee output.log` 

如果我運行這個原來的樣子,只有標準錯誤使它到控制檯,只有標準輸出它使雙方的output.log文件和$ result變量。我明白這是爲什麼,但許多嘗試不同的重定向都未能將這兩個流發送到所有三個位置。

如何將stderr和stdout都發送到所有三個位置?

回答

5
result=`./command 2>&1 | tee output.log | tee /dev/tty` 

[編輯]

作爲N.M.在評論中指出,tee接受多個參數:

result=`./command 2>&1 | tee output.log /dev/tty` 

[第二編輯]

在評論從克里斯借用一個想法,你也可以做到這一點的輸出發送到標準錯誤:

result=`./command 2>&1 | tee /tmp/foo.log >(cat 1>&2)` 

要做到你想要什麼,我已經找到了最好的是這樣的:

exec 3>&1 ; result=`./command 2>&1 | tee /tmp/foo.log >(cat 1>&3)` ; exec 1>&3 

(這裏的所有問題都是在內部任何內容執行之前反引號標準輸出。所以這行保存和恢復舊的標準輸出爲描述符3,這可能是也可能不是一個好主意......)

+3

tee需要任意數量的參數,如'... | tee output.log/dev/tty' –

+0

@ n.m。你每天學習新的東西。謝謝。 – Nemo

+0

此方法的一個問題 - 如果我想將輸出的父母bash腳本重定向到另一個文件,那麼輸出將不會重定向到那裏。 –

相關問題