一尘不染

Shell:将stdout重定向到/ dev / null,将stderr重定向到stdout

linux

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

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

到目前为止,我对解决方案的想法是:

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

但是您会看到,这不是同步的,而且致命的是,它是如此丑陋。

欢迎与您分享这个想法。:)


阅读 251

收藏
2020-06-03

共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脚本的stdin连接到管道,而script的stdout连接到管道,因此到目前为止,脚本的文件描述符如下:

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

最终结果是,脚本的stdout被静默,并且其stderr通过管道发送,该管道最终在其他脚本的stdin中。

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

还要注意,它1>/dev/null是的同义词,但比>/dev/null

2020-06-03