命令输出不在stderr或stdout中


16

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

标准运行命令:

# 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

stderr到stdout?

# zabbix_sender -c zabbix_agentd.conf -k mmysql.QCInserts -o 14 2>&1 | tee
sent: 1; skipped: 0; total: 1

我真的很困惑


您期待tee什么?如果您跑步会zabix_sender <options> 2>&1 | head -1怎样?
terdon

Answers:


16

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

您可以通过比较下面的两个示例来解决此问题

( 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,然后您可以照常进行重定向。


感谢您指向“脚本”的指针!这正是我需要解决gpg / gpg2顽固不读stdin的东西。
埃里克

谢谢。花了很多时间才能到达这里。令人惊讶的是,这是一个不受欢迎的问题(我正在处理VLC)。
保罗

script: illegal option -- c:(您还有其他解决方法吗?
Aaron
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.