我在cyberciti.biz的评论中看到了这个有趣的问题。
我发现我什至找不到在sh的单行命令中执行此操作的灵活方法。
到目前为止,我对解决方案的想法是:
tmp_file=`mktemp` (./script 2>$tmp_file >/dev/null; cat $tmp_file) | ./other-script rm tmp_file
但是您会看到,这不是同步的,而且致命的是,它是如此丑陋。
欢迎与您分享这个想法。:)
你要
./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当前所在的位置,即管道。
2>&1
0: /dev/tty, 1: pipe, 2: pipe
最后,1>/dev/null将fd1重定向到/dev/null
1>/dev/null
/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
>/dev/null