web-dev-qa-db-ja.com

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

逆グレップ?セド?ティー?!?!?!!?

# 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

stdoutからstdoutへ?

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

私は本当に困惑しています...

16
Jakov Sosic

これは、アプリケーションがSTDOUTまたはSTDERRではなくTTYに直接書き込んでいる場合に発生する可能性があります。

以下の2つの例を比較することで、この動作を試すことができます

( echo foo ) &>/dev/null
( echo foo > $(tty) ) &>/dev/null

最初のものは何も表示していませんが、2つ目は表示しています。これは、出力をttyに直接送信し、/dev/nullへのリダイレクトをバイパスしたためです。

scriptを使用すると、このようなものを回避できます

script -c '( echo foo > $(tty) ) &>/dev/null'  >/dev/null

基本的に、scriptユーティリティは偽のttyを作成し、そのttyでコマンドを起動します。コマンドからの出力はすべてSTDOUTに送信され、通常どおりリダイレクトできます。

16
Patrick