命令的输出不在 stderr 或 stdout 中

Jak*_*sic 17 shell stdout stderr

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

命令的标准运行:

# 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
Run Code Online (Sandbox Code Playgroud)

好的,让我们尝试只获取第一行:

# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 | head -1
sent: 1; skipped: 0; total: 1
Run Code Online (Sandbox Code Playgroud)

标准头呢?

# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 | head 
sent: 1; skipped: 0; total: 1
Run Code Online (Sandbox Code Playgroud)

反向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
Run Code Online (Sandbox Code Playgroud)

标准错误到标准输出?

# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 2>&1 | tee
sent: 1; skipped: 0; total: 1
Run Code Online (Sandbox Code Playgroud)

我真的很纳闷...

phe*_*mer 18

如果应用程序直接写入 TTY 而不是 STDOUT 或 STDERR,就会发生这种情况。

您可以通过比较下面的 2 个示例来尝试这种行为

( echo foo ) &>/dev/null
( echo foo > $(tty) ) &>/dev/null
Run Code Online (Sandbox Code Playgroud)

请注意,第一个没有显示任何内容,但第二个显示。那是因为我们将输出直接发送到 tty 并绕过重定向到/dev/null.

你可以通过使用解决这样的事情 script

script -c '( echo foo > $(tty) ) &>/dev/null'  >/dev/null
Run Code Online (Sandbox Code Playgroud)

基本上,该script实用程序会创建一个假 tty 并在该 tty 中启动命令。命令的任何输出都会发送到 STDOUT,然后您可以正常重定向。