【问题标题】:Copy stderr to both file and terminal in POSIX sh将 stderr 复制到 POSIX sh 中的文件和终端
【发布时间】:2018-01-08 22:09:46
【问题描述】:

在连接到关系数据库的 AWS DataPipeline 中编写一个 shell 脚本,即使是 SQL 错误,退出代码也是 0,所以我需要捕获 + 重定向 stderr。

我将 stderr 重定向到另一个文件以检查其内容,但仍希望填充 stderr。原因是 DataPipeline 捕获所有标准错误和标准输出并将它们全部放入 1 个日志中。由于重定向,它没有从失败的 sql 命令中捕获标准错误。有没有办法仍然填充stderr?我目前拥有的是:

/bin/snowsql -f /home/scripts/dev/dev.sql 2> /home/scripts/dev/stderr.txt

【问题讨论】:

  • 嗯。我们有很多重复的问题,询问如何重定向 both stdout 和 stderr。

标签: shell sh stderr io-redirection


【解决方案1】:

这在 bash 中会短很多:

#!/bin/bash
#      ^^^^- NOT /bin/sh

...yourcommand... 2> >(tee stderr.text >&2)

以符合 POSIX 的方式,它看起来更像:

#!/bin/sh

rm -f -- "stderr_and_logfile.$$"
mkfifo -- "stderr_and_logfile.$$" || exit
tee stderr.txt <"stderr_and_logfile.$$" >&2 &

/bin/snowsql -f /home/scripts/dev/dev.sql 2>"stderr_and_logfile.$$"; retval=$?

rm -f -- "stderr_and_logfile.$$"
exit "$retval" # so "rm" doesn't cause the exit status of snowsql to be discarded

【讨论】:

  • 谢谢,查看您上述评论中的链接,我最终将脚本更改为/bin/snowsql -f /home/scripts/dev/dev.sql 2&gt; &gt;(tee /home/ubuntu/scripts/dev/stderr.txt &gt;&amp;2),但收到redirection unexpected 的错误。
  • 看起来你的外壳是sh,而不是bash。 Bash 语法只保证可用于bash yourscript,而不是sh yourscript;即使这两个命令引用同一个磁盘上的可执行文件,bash 在以 sh 名称启动时也会以 POSIX 兼容模式运行。
  • 啊 - 所以当我指定 bash shebang 时它起作用了,但是 tee 是否有等效的 shell?我所有的搜索都显示使用tee,我似乎不知道正确的问题来要求这个在没有 bash 的情况下工作
  • tee 不是仅限 bash 的部分,它是 &gt;() 进程替换语法。是的,您可以以符合 POSIX 的方式做到这一点,只是更冗长。在询问时标记您的问题sh,而不是bash
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 2022-12-07
  • 2018-08-20
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
相关资源
最近更新 更多