【问题标题】:How to get stderr after error redirection in bash如何在bash中错误重定向后获取stderr
【发布时间】:2015-02-04 20:22:23
【问题描述】:

我有一个 bash 脚本,它运行一些任务并一路将错误重定向到 /stderr。

这意味着脚本开始于:

exec 2>$TMPDIR/stderr

现在,我唯一想要的是,在脚本完成运行后,我如何取回已写入 stderr 的任何潜在错误?因为,我只想在 bash 运行完所有脚本后才显示错误。

【问题讨论】:

  • cat "$TMPDIR"/stderr 最后?
  • @j.a.你是对的,但我想把它作为一个错误来回应。 cat 只会将其列为项目列表。有没有办法解决这个问题?
  • 如果你想在执行过程中输出写到"$TMPDIR"/stderr,你需要将stdout/stderr都重定向到tee。或者如果你真的想要它:exec 2>$TMPDIR/stderr; cat "$TMPDIR"/stderr 作为一个命令(或一个接一个)
  • 以前从未听说过tee。你能补充更多细节吗?
  • 有些事情对你有帮助。一个已经提到tee,另一个是trap(shell 内置),当您的脚本自动结束其生命周期时,您可以使用它来运行一些代码。

标签: bash shell


【解决方案1】:

您可以在末尾打印$TMPDIR/stderr的内容:

cat "$TMPDIR"/stderr 

要打印“作为错误”(正如您在评论中所说),您可能正在寻找这个:

cat "$TMPDIR"/stderr >&2

即将cat命令的输出重定向到stderr

【讨论】:

  • 这是我一直在寻找的,但太菜鸟了。但是又想到了一件事,因为我想在最后说"Script failed because of error ..." 我想知道最后是否真的有错误。如何先检查$TMPDIR/stderr是否有错误?是否有类似的功能来检查该文件是否为空?
  • 你可以使用if [ -s "$TMPDIR"/stderr ]; then来做一些事情只有当文件不为空(=有错误)
【解决方案2】:

如果您将所有标准错误消息定向到/dev/stderr&2(用于存储错误消息的目标文件),这些消息将不会存储在文件中。在bash中理解为“/dev/stderr”是屏幕/终端。

因此,您可以将所有 stderr 消息定向到 stderr 消息文件,并使用以下方法防止消息显示在屏幕/终端中:

my_script 2> "my_error_message_file"

脚本完成后返回错误消息的解决方案

我认为要打开您的错误消息文件,您必须在脚本末尾添加一些代码才能打开错误消息文件

cat "my_error_message_file"

【讨论】:

  • 我认为你误解了这个问题。我从屏幕上隐藏错误消息没有问题,我的问题是之后显示错误
  • 我编辑了我的评论以获得一个我会做的小解决方案..但是我不知道这样做的任何其他方式..祝你好运..
猜你喜欢
  • 2010-09-07
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
相关资源
最近更新 更多