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