2014-04-30 56 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