Output dari perintah tidak di stderr atau stdout

15

Saya menemukan masalah ini, jadi saya bertanya-tanya bagaimana mungkin?

Menjalankan perintah standar:

# 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

Oke, mari kita coba untuk mendapatkan baris pertama saja:

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

Bagaimana dengan kepala standar?

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

Grep terbalik? sed? tee?!?!? !!?

# 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 ke stdout?

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

Saya benar-benar bingung ...

Jakov Sosic
sumber
Dengan apa yang Anda harapkan tee? Apa yang terjadi jika Anda berlari zabix_sender <options> 2>&1 | head -1?
terdon

Jawaban:

15

Ini bisa terjadi jika aplikasi menulis langsung ke TTY, bukan STDOUT atau STDERR.

Anda dapat bermain dengan perilaku ini dengan membandingkan 2 contoh di bawah ini

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

Perhatikan yang pertama tidak menunjukkan apa-apa, tetapi yang kedua tidak. Itu karena kami mengirim output langsung ke tty dan melewati pengalihan ke /dev/null.

Anda dapat menyiasati hal-hal seperti ini dengan menggunakan script

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

Pada dasarnya scriptutilitas membuat tty palsu dan meluncurkan perintah di tty itu. Setiap output dari perintah dikirim ke STDOUT yang kemudian dapat Anda redirect seperti biasa.

Patrick
sumber
Terima kasih atas penunjuk ke "skrip"! Itulah hal yang saya butuhkan untuk mengatasi desakan keras kepala gpg / gpg2 untuk tidak membaca dari stdin.
Eric
Terima kasih. Butuh sedikit pencarian untuk sampai ke sini. Luar biasa karena ini adalah pertanyaan yang tidak populer (saya berurusan dengan VLC).
Paul
script: illegal option -- c:( Apakah ada solusi lain yang Anda ketahui?
Aaron