在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
答案 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