stderrまたはstdoutにないコマンドの出力


15

私はこの問題につまずいたので、これがどのように可能か疑問に思っていますか?

コマンドの標準実行:

# 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

OK、最初の行のみを取得してみましょう。

# 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か?
テルドン

回答:


15

これは、アプリケーションが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に送信され、通常どおりリダイレクトできます。


「スクリプト」へのポインタをありがとう!これは、gpg / gpg2のstdinから読み取らないという頑固な主張を回避するために必要なものです。
エリック

ありがとう。ここにたどり着くまでにかなりの時間をかけました。これはあまり人気のない質問です(私はVLCを扱っています)。
ポール

script: illegal option -- c:(あなたが知っている他の回避策はありますか?
アーロン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.