Komut çıkışı stderr veya stdout'ta değil


16

Bu konuda tökezledim, bu yüzden bunun nasıl mümkün olduğunu merak ediyorum?

Standart komut çalıştırma:

# 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

Tamam, sadece ilk satırı almaya çalışalım:

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

Standart kafa ne olacak?

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

Ters grep? 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 stdout için?

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

Gerçekten şaşkınım ...


Ne bekliyordun tee? Kaçarsan ne olur zabix_sender <options> 2>&1 | head -1?
terdon

Yanıtlar:


16

Bu, uygulama STDOUT veya STDERR yerine doğrudan TTY'ye yazıyorsa oluşabilir.

Aşağıdaki 2 örneği karşılaştırarak bu davranışla oynayabilirsiniz

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

İlki hiçbir şey göstermez, ikincisi göstermez. Çünkü çıktıyı doğrudan tty'ye gönderdik ve yönlendirmeyi atladık /dev/null.

Bu gibi şeyleri kullanarak script

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

Temel olarak scriptyardımcı program sahte bir tty oluşturur ve bu tty'deki komutu başlatır. Komuttan gelen herhangi bir çıktı STDOUT'a gönderilir ve normal şekilde yönlendirebilirsiniz.


"Senaryo" işaretçisi için teşekkür ederiz! Bu tam olarak gpg / gpg2'nin stdin'den okumaya dair inatçı ısrarı etrafında çalışmam gereken şeydi.
Eric

Teşekkürler. Buraya ulaşmak için biraz arama yaptım. Bu kadar popüler olmayan bir soru (VLC ile uğraşıyorum) şaşırtıcı.
Paul

script: illegal option -- c:( Bildiğiniz başka geçici çözümler var mı?
Aaron
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.