我有一系列bash scripts
echo
大量数据发送到stdout
,偶尔发送到stderr
。有一个主bash script
,然后是imports
和/或invokes
许多其他bash scripts
。
我正在尝试实现一些东西,它不仅会捕获父脚本的输出,还会捕获所有子脚本的输出。我需要同时捕获stdout
和stderr
,以便编译等任何问题都会在此日志文件中捕获。
我知道tee
,当然还有正常的stdout
重定向>
...但是如果没有将这些命令添加到每个行中,这些似乎不起作用脚本,父母和孩子。这些脚本中有几千行,因此即使使用sed
,向每行添加重定向也是不切实际的。
我见过以下建议:Redirect stderr and stdout in a Bash script
但这些需要编辑脚本中的每一行。强制我的用户安装screen
也是不切实际的。
UPDATE:
忘记提及我希望输出仍然显示在控制台上以及写入日志。脚本需要几个小时才能运行,用户需要知道发生了什么......
答案 0 :(得分:3)
您可以使用yourmainscript 2>&1 | tee log
从yourmainscript
中的所有导入/调用的脚本捕获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"