将stderr复制到POSIX sh中的文件和终端

时间:2017-08-01 21:34:46

标签: shell sh stderr io-redirection

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

我正在将stderr重定向到另一个文件以检查其内容,但仍希望填充stderr。原因是DataPipeline捕获所有stderr和stdout并将它们全部放入1个日志中。由于重定向,它不会从失败的sql命令捕获stderr。有没有办法让stderr填充?我现在拥有的是:

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

1 个答案:

答案 0 :(得分:0)

在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