在POSIX中将stderr复制到文件和终端sh
在连接到关系数据库的AWS DataPipeline中编写shell脚本,即使SQL错误也退出代码为0,所以我需要捕获+重定向stderr。在POSIX中将stderr复制到文件和终端sh
我将stderr重定向到另一个文件以检查其内容,但仍然希望填充stderr。原因是DataPipeline捕获所有stderr和stdout,并将它们全部放入1个日志中。它没有捕获失败的sql命令中的stderr,因为重定向。是否还有一种方法可以保持stderr填充?我现在拥有的是:
/bin/snowsql -f /home/scripts/dev/dev.sql 2> /home/scripts/dev/stderr.txt
这将是在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>>(tee/home/ubuntu/scripts/dev/stderr.txt>&2)'但是出现'意外重定向'的错误。 – simplycoding
看起来你的壳是'sh',而不是'bash'。 Bash语法只保证可用'bash yourscript'而不是'sh yourscript';即使这两个命令引用了磁盘上的同一个可执行文件,当以“sh”命名时,bash仍以POSIX兼容模式运行。 –
啊 - 所以它在我指定bash shebang时有效,但是有没有与'tee'等价的外壳?我所有的搜索都继续显示使用'tee',我似乎无法知道正确的问题,因此要求这个工作没有bash – simplycoding
嗯。我们有很多重复的内容,要求如何重定向* stdout和stderr。 –