由于我错误地用bash标签问进来,认为这是一个更合适的地方,所以我重新问了一下我的问题。
我正在AWS DataPipeline中编写一个shell脚本,该脚本连接到关系数据库,即使是对于SQL错误,退出代码也是0,所以我需要捕获+重定向stderr。
我将stderr重定向到另一个文件以检查其内容,但仍然希望填充stderr。原因是DataPipeline捕获了所有的stderr和stdout,并将它们都放入了一个日志中。由于重定向,它没有从失败的sql命令中捕获stderr。还有什么方法可以让stderr居住吗?我目前拥有的是:
/bin/snowsql -f /home/scripts/dev/dev.sql 2> /home/scripts/dev/stderr.txt以下内容与Bash合作:
/bin/snowsql -f /home/scripts/dev/dev.sql 2> >(tee /home/scripts/dev/stderr.txt >&2)我找不到正确的语法来替换shell进程。在shell中做以上操作的等效性是什么?
发布于 2017-08-01 23:55:55
在sh中,只能将stdout输送到另一个命令,因此必须首先交换stdout和stderr:
/bin/snowsql -f /home/scripts/dev/dev.sql 3>&2 2>&1 >&3 3>- | tee /home/scripts/dev/stderr.txt
重定向是从左到右执行的,但管道除外,这是在最开始创建的,所以这样做可以:
|)3>&2)2>&1)>&3)3>-)在这种状态下,我们交换了stdout和stderr,管道接收stderr。然后,我们让tee完成它的工作,将stderr写到文件中,并在它自己的stdout上再次输出它。
多亏了这个StackOverflow,小技巧的答案是:https://stackoverflow.com/a/2381643
https://unix.stackexchange.com/questions/383310
复制相似问题