【问题标题】:Copy script output to file将脚本输出复制到文件
【发布时间】:2014-06-17 03:06:24
【问题描述】:

我有一系列的bash scripts echo 很多数据给stdout,偶尔也给stderr。有一个主要的bash script,然后是imports 和/或invokes 许多其他bash scripts

我正在尝试实现一些东西,它不仅可以捕获父脚本的输出,还可以捕获所有子脚本的输出。我需要同时捕获stdoutstderr,以便在此日志文件中捕获来自编译等的任何问题。

我知道tee,当然还有普通的stdout 重定向>...但是如果不将这些命令添加到每个脚本的每一行,无论是父脚本还是子脚本,这些似乎都不起作用.这些脚本中有几千行,因此即使使用sed,为每一行添加重定向也是不切实际的。

我看到过一些建议,例如:Redirect stderr and stdout in a Bash script

但是这些需要编辑脚本中的每一行。强迫我的用户安装screen 也是不切实际的。

UPDATE:

忘了提到我希望输出仍然显示在控制台上以及写入日志。脚本需要几个小时才能运行,用户需要知道正在发生的事情......

【问题讨论】:

  • script -c master_script.sh /path/to/some/log/file...

标签: bash logging


【解决方案1】:

您可以使用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"

【讨论】:

  • 我忘了提到我仍然希望输出也显示在控制台上,以及写入这个日志文件。 (脚本需要几个小时才能运行,用户需要知道某些事情仍在发生)。
  • @SnakeDoc,假设您希望 stderr 和 stdout 进入同一个日志,main.sh 2>&1 | tee logfileecho starting; { your_code_here; } 2>&1 | tee logfile 有什么问题??
  • @glennjackman 如果这会将输出显示到控制台,并将其写入日志,对于 stdoutstderr 的所有脚本(父和子),那么它可能工作。 Makefile 只需调用main.sh 为:main.sh 2>&1 | tee runtime.log。 (在一个大的编译atm中间,所以直到它完成我才能尝试)。
猜你喜欢
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
相关资源
最近更新 更多