命令的输出不在 stderr 或 stdout 中

命令的输出不在 stderr 或 stdout 中

我偶然发现了这个问题,所以我想知道这怎么可能?

标准运行命令:

# 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,然后您可以正常重定向。

相关内容