![如何将 stderr 重定向到 stdout 然后通过管道(apt-cache)](https://linux22.com/image/182526/%E5%A6%82%E4%BD%95%E5%B0%86%20stderr%20%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%20stdout%20%E7%84%B6%E5%90%8E%E9%80%9A%E8%BF%87%E7%AE%A1%E9%81%93%EF%BC%88apt-cache%EF%BC%89.png)
我正在尝试重定向stderr
到stdout
它pipe
,但我认为我在这里遗漏了一些基本的东西。
要通过管道传输的命令和输出:
$ apt-cache show contractor
N: Can't select versions from package 'contractor' as it is purely virtual
N: No packages found
Grep 不起作用 - 必须输出到stderr
:
$ apt-cache show contractor |grep virtual
好的,让我们重定向stderr
到stdout
:
$ apt-cache show contractor 2>&1 |grep virtual
不,这不起作用,为什么?
确认命令正在使用哪个文件描述符:
$ apt-cache show contractor 1>t ;cat t
$ apt-cache show contractor 2>t ;cat t
N: Can't select versions from package 'contractor' as it is purely virtual
N: No packages found
确认正在使用stderr
。
与重定向的顺序有关吗?
$ apt-cache show contractor |cat 2>&1
没有
$ apt-cache show contractor 2>&1 |cat 2>&1
没有
如何重定向stderr
到stdout
那时pipe
?
答案1
这是因为apt-cache
当它的标准输出不是 tty 时,它将变得“安静”并且不会打印这些行。
您可以通过将其“安静度”设置为 0 来覆盖该确定:
$ apt-cache -q=0 show contractor 2>&1 | grep virtual
N: Can't select versions from package 'contractor' as it is purely virtual