![stderr 未重定向到 stdout](https://linux22.com/image/8029/stderr%20%E6%9C%AA%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%20stdout.png)
我运行一个TACACS+服务器它将调试信息发送到stderr
.由于我想从此调试信息中 grep 特定数据,因此我重定向stderr
到stdout
: tac_plus -f /usr/local/etc/tac_plus.cfg 2>&1
。然而,看起来它实际上并没有转到stdout
,因为如果我执行tac_plus -f /usr/local/etc/tac_plus.cfg 2>&1 | cat
,那么我根本看不到任何输出。另一方面,( echo blah >&2 ) 2>&1 | tr 'a-z' 'A-Z'
按预期工作:
$ ( echo blah >&2 ) 2>&1 | tr 'a-z' 'A-Z'
BLAH
$
有人可以解释这种行为吗? Shell 是 bash 版本 4.2.37。
答案1
如果我们看一下来源report()
我们可以看到用于打印消息的函数 可以配置为写入 stderr,或用于syslog(3)
记录它们。它还取决于您配置的日志记录级别。您可以查看该命令是否正在执行任何写入或系统日志调用,例如:
strace -e write,connect -o /tmp/out tac_plus ...
查看 tmp 文件中是否有类似write(1,...
或其他数字的行,可能 1 表示 stdout,2 表示 stderr,3 或更多,因为syslog
它是通过打开套接字并向connect()
其写入来实现的。