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 ...


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.