首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重定向回shell中的stderr

重定向回shell中的stderr
EN

Unix & Linux用户
提问于 2017-08-01 22:46:19
回答 1查看 601关注 0票数 1

由于我错误地用bash标签问进来,认为这是一个更合适的地方,所以我重新问了一下我的问题。

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

我将stderr重定向到另一个文件以检查其内容,但仍然希望填充stderr。原因是DataPipeline捕获了所有的stderr和stdout,并将它们都放入了一个日志中。由于重定向,它没有从失败的sql命令中捕获stderr。还有什么方法可以让stderr居住吗?我目前拥有的是:

代码语言:javascript
复制
/bin/snowsql -f /home/scripts/dev/dev.sql 2> /home/scripts/dev/stderr.txt

以下内容与Bash合作:

代码语言:javascript
复制
/bin/snowsql -f /home/scripts/dev/dev.sql 2> >(tee /home/scripts/dev/stderr.txt >&2)

我找不到正确的语法来替换shell进程。在shell中做以上操作的等效性是什么?

EN

回答 1

Unix & Linux用户

发布于 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

重定向是从左到右执行的,但管道除外,这是在最开始创建的,所以这样做可以:

  1. 打开管道并重定向其中的标准输出(|)
  2. 复制stderr并将文件描述符3(这是arbritrary)重定向到它,以便稍后重用它(3>&2)
  3. 重复的stdout (当前重定向到管道)和将stderr重定向到它(2>&1)
  4. 重复文件描述符3(当前在原始stderr中重定向)和将stdout重定向到它(>&3)
  5. 关闭文件描述符3 (3>-)

在这种状态下,我们交换了stdout和stderr,管道接收stderr。然后,我们让tee完成它的工作,将stderr写到文件中,并在它自己的stdout上再次输出它。

多亏了这个StackOverflow,小技巧的答案是:https://stackoverflow.com/a/2381643

票数 5
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/383310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档