shell:redirect标准输出到/ dev / null和stderr标准输出

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

我发现我甚至找不到一个灵活的方式来用sh执行单行命令。

至于我的解决scheme的想法是:

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

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

欢迎与我们分享你的想法。 🙂

Solutions Collecting From Web of "shell:redirect标准输出到/ dev / null和stderr标准输出"

你要

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

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

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

首先建立的是管道。 其他脚本的stdin被连接到管道,脚本的stdout被连接到管道,所以脚本的文件描述符如下所示:

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

接下来,重定向从左到右发生。 2>&1使fd 2到达fd 1当前正在进行的哪个位置,这是管道。

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

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

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

最终的结果是,脚本的stdout是静音的,它的stderr是通过管道发送的,这个管道以其他脚本的stdin结尾。

另请参阅http://bash-hackers.org/wiki/doku.php/howto/redirect_tutorial

这个怎么样:

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

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

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

那是因为你不能。 STDOUT和STDERR只是两个文件,由文件描述符表示,它们只是整数,具体为1和2。

你所要求的是将描述符2设置为/dev/null ,然后将描述符3设置为相同的文件描述符2,并将输出传送到其他位置。