我偶然发现了这个问题,所以我想知道这怎么可能?
标准运行命令:
# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14
info from server: "Processed 0 Failed 1 Total 1 Seconds spent 0.000017"
sent: 1; skipped: 0; total: 1
好的,让我们尝试只获取第一行:
# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 | head -1
sent: 1; skipped: 0; total: 1
标准头呢?
# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 | head
sent: 1; skipped: 0; total: 1
逆向 grep ? sed?球座?!?!?!!?
# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 | grep -v pero
sent: 1; skipped: 0; total: 1
# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 | sed 's/foo/bar/'
sent: 1; skipped: 0; total: 1
# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 | tee
sent: 1; skipped: 0; total: 1
标准错误到标准输出?
# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 2>&1 | tee
sent: 1; skipped: 0; total: 1
我真的很困惑...
答案1
如果应用程序直接写入 TTY 而不是 STDOUT 或 STDERR,则可能会发生这种情况。
您可以通过比较下面的 2 个示例来尝试这种行为
( echo foo ) &>/dev/null
( echo foo > $(tty) ) &>/dev/null
请注意,第一个没有显示任何内容,但第二个则显示任何内容。这是因为我们将输出直接发送到 tty 并绕过了重定向到/dev/null
.
你可以通过使用来解决这样的问题script
script -c '( echo foo > $(tty) ) &>/dev/null' >/dev/null
基本上,该script
实用程序创建一个假 tty 并在该 tty 中启动命令。该命令的任何输出都会发送到 STDOUT,然后您可以正常重定向。