2014-04-30 85 views
0

我有一系列bash scriptsecho很多數據到stdout和偶爾到stderr。主要有bash script然後imports和/或invokes許多其他bash scripts複製腳本輸出到文件

我想實現的東西,將捕獲不僅是父母的腳本,但所有兒童腳本的輸出。我需要捕獲stdoutstderr,以便在編譯等問題時可以捕獲到這個日誌文件中。

我所知道的tee當然正常stdout重定向>的...但這些似乎並沒有任何增加這些命令每個腳本,雙方父母和子女的每一行工作。這些腳本中有幾千行,因此即使使用sed,爲每行添加重定向也是不切實際的。

我見過的建議,如:Redirect stderr and stdout in a Bash script

但這些都需要編輯的腳本中的每一行。強迫我的用戶安裝screen也是不切實際的。

UPDATE:

忘了提我所要的輸出仍然顯示控制檯以及寫入日誌上。腳本需要幾個小時才能運行,並且用戶需要知道正在發生的事情...

+1

'腳本-c master_script.sh /路徑/到/一些/日誌/ file' ... – twalberg

回答

3

您可以使用yourmainscript 2>&1 | tee logyourmainscript中的所有導入/調用腳本捕獲stdout和stderr,同時在屏幕上顯示它。

裏面yourmainscript,則可以使用得到同樣的效果:

echo "Redirecting the rest of script output to 'log'" 
exec > >(tee log) 2>&1 
rest of your code 

重定向只是一個特定部分:

echo "Redirecting the next commands" 
{ 
    cmd1 
    cmd2 
} > >(tee log) 2>&1 
echo "Continuing as normal" 
+0

我忘了提及我還希望輸出也顯示在控制檯上,並寫入此日誌文件。 (腳本需要幾個小時才能運行,用戶需要知道還在發生的事情)。 – SnakeDoc

+0

@SnakeDoc,假設你想讓stderr和stdout去同一個日誌,'main.sh 2>&1 | tee logfile'或'echo start; {your_code_here; } 2>&1 | tee logfile' ?? –

+0

@glennjackman如果這將顯示輸出到控制檯,並將它寫入日誌,對於所有腳本(父和子)的'stdout'和'stderr',那麼它可能會工作。 'Makefile'只需要調用'main.sh'如'main.sh 2>&1 | tee runtime.log'。 (在一個大的彙編中,所以我不能嘗試它,直到它完成)。 – SnakeDoc