2013-10-09 119 views
0

我有一個ksh93腳本(但問題不是ksh相關的)。如何在腳本中記錄shell腳本輸出

目前,我跑我的腳本是這樣的:

./script 2>&1 | tee logfile 

我不知道我應該在我的劇本得到完全相同的結果(屏幕輸出,以及包含STDOUT和STDERR輸出日誌文件)。 當然,我想避免添加「|」 tee logfile'爲每個迴音/打印我做。

當然,有一種方法可以將我的腳本封裝到另一個只運行'./script 2> & 1 | tee日誌文件「,但我想知道這是否可以在腳本本身內完成。

回答

2

一個常見的技術,該技術是有點脆弱的是:

#!/bin/sh 
test -z "$NOEXEC" && { NOEXEC=1 exec "$0" "[email protected]" 2>&1 | tee logfile; exit; } 
... 

這將放棄返回值和退出與tee返回的值。這可能是也可能不是問題,可能是所需的行爲。

+0

您能否評論退出的必要性?看起來這將使腳本始終以狀態0退出,而不管「tee」的退出狀態如何。 – chepner

+0

沒關係,需要'exit'來防止腳本運行兩次。但也許'退出$?'是必要的。 – chepner

+1

不帶參數的'exit'與'exit $?'相同 –

3

如果你的腳本的當前內容是:

command1 arg1 
command2 arg2 

你可以用該批次(在腳本中)是這樣的:

{ 
command1 arg1 
command2 arg2 
} 2>&1 | tee logfile 

{}代碼現在腳本中的一個I/O重定向單元;最後的I/O重定向適用於所有包含的命令。它不創建子外殼;在I/O重定向之後,腳本中的任何變量均可用。

{}在語法上略有特殊;特別是}必須以分號或換行符開頭。

+0

你的解決方案似乎比william的解決方案更「乾淨」,但與我的腳本一起使用,它沒有完成所有工作而返回。很奇怪,不知道爲什麼,也沒有時間去調查。我在遠程機器上通過ssh運行了很多命令,這些機器在括號內沒有執行(使用ksh93)。 – claf

+0

奇怪 - 我不知道爲什麼會發生。 –