我在cyberciti.biz的评论中看到了这个有趣的问题。
我发现我甚至无法用一行sh命令以灵活的方式完成这个问题。
根据我的思路,解决方案是:
tmp_file=`mktemp`
(./script 2>$tmp_file >/dev/null; cat $tmp_file) | ./other-script
rm tmp_file
但是你看,这不是同步的,而且很丑陋。
欢迎分享你对此的看法。:)
我在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-script”的标准输入连接到管道上,同时将“script”的标准输出也连接到同一个管道上,因此,到目前为止,“script”文件描述符的情况如下:
0: /dev/tty, 1: pipe, 2: /dev/tty
接下来,重定向会从左到右进行。 2>&1
使文件描述符 2 去到当前文件描述符 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
同义,但更加明确。
tee
命令。./script 2>&1 >/dev/null | tee file
- geirhaping www.google.com 2>&1 1>/dev/null | perl -nle 'print scalar(localtime), " ", $_'
- Kharthigeyan./script 3>&1 1>/dev/null 2>&3 | ./other-script
那是因为你不能这样做。STDOUT 和 STDERR 只是两个文件,由文件描述符表示,这些描述符只是整数,具体来说是 1 和 2。
你要求的是将描述符 2 设置为/dev/null
,然后将描述符 3 设置为相同的文件描述符 2,并将输出发送到其他地方。
./script.sh 2>&1 >/dev/null
吗? - cnicutar2>&1
会将stderr
重定向到stdout
,然后1>/dev/null
将它们两个都重定向到/dev/null
。好吧,我需要重新学习一些 shell。 - shouya2>&1
需要放在结尾,例如:if ping -c 1 fake.x > /dev/null 2>&1;then echo true;else echo false;fi
。 - Jonathan Cross