【问题标题】:Shell: redirect stdout to /dev/null and stderr to stdout [duplicate]Shell:将标准输出重定向到 /dev/null 并将标准错误重定向到标准输出 [重复]
【发布时间】:2012-08-15 03:56:15
【问题描述】:

我在cyberciti.biz 的评论中看到了这个有趣的问题。

我发现我什至找不到一种灵活的方法来使用 sh 在单行命令中执行此操作。

我对解决方案的想法是:

tmp_file=`mktemp`
(./script 2>$tmp_file >/dev/null; cat $tmp_file) | ./other-script
rm tmp_file

但是你看,这不是同步的,而且致命的是,它太丑了。

欢迎分享你的想法。 :)

【问题讨论】:

  • 你试过./script.sh 2>&1 > /dev/null 吗?
  • @cnicutar 看来我一开始理解错了。我想2>&1 会将stderr 重定向到stdout,然后1>/dev/null 会将它们都重定向到/dev/null。好吧,我需要重新学习一些 shell。
  • 就我而言,2>&1 需要放在最后,例如:if ping -c 1 fake.x > /dev/null 2>&1;then echo true;else echo false;fi

标签: linux bash shell sh


【解决方案1】:

你想要

./script 2>&1 1>/dev/null | ./other-script

这里的顺序很重要。假设 stdin (fd 0)、stdout (fd 1) 和 stderr (fd 2) 最初都连接到一个 tty,所以

0: /dev/tty, 1: /dev/tty, 2: /dev/tty

首先要设置的是管道。 other-script 的标准输入连接到管道,脚本的标准输出连接到管道,所以脚本的文件描述符到目前为止看起来像:

0: /dev/tty, 1: pipe, 2: /dev/tty

接下来,重定向发生,从左到右。 2>&1 让 fd 2 走到 fd 1 当前去的任何地方,也就是管道。

0: /dev/tty, 1: pipe, 2: pipe

最后,1>/dev/null 将 fd1 重定向到 /dev/null

0: /dev/tty, 1: /dev/null, 2: pipe

最终结果,脚本的标准输出被静音,它的标准错误通过管道发送,最终进入其他脚本的标准输入。

另见http://bash-hackers.org/wiki/doku.php/howto/redirection_tutorial

另请注意,1>/dev/null>/dev/null 的同义词,但比 >/dev/null 更明确

【讨论】:

  • 在我的编辑评论中,尽管编辑本身仍然正确,但我错误地引用了标准输入而不是标准输出。我看不到如何修复编辑评论或对编辑评论的评论,所以在这里提到。
  • @geirha 非常好。如果我们必须输出到 >/dev/null,并且 stderr 同时输出到文件和屏幕怎么办?谢谢
  • @ManoharReddyPoreddy 要同时输出到终端和文件,请使用tee 命令。 ./script 2>&1 >/dev/null | tee file
【解决方案2】:

这个怎么样:

./script 3>&1 1>/dev/null 2>&3 | ./other-script

想法是“备份”标准输出描述符,关闭原始标准输出,然后将 strerr 重定向到保存的标准输出。

它与 geirha 提供的解决方案非常相似,但更明确(bash 编码很容易变得非常模糊)。

【讨论】:

    【解决方案3】:

    嗯,那是因为你做不到。 STDOUT 和 STDERR 只是两个文件,用文件描述符表示,只是整数,具体是 1 和 2。

    您的要求是将描述符 2 设置为 /dev/null,然后将描述符 3 设置为相同的文件描述符 2,然后将该输出转到其他位置。

    【讨论】:

      猜你喜欢
      • 2012-05-26
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 2020-11-05
      • 2017-05-13
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多