เอาต์พุตของคำสั่งไม่ได้อยู่ใน stderr หรือ stdout


16

ฉันพบปัญหานี้แล้วฉันจึงสงสัยว่าจะเป็นไปได้อย่างไร

คำสั่งรันแบบมาตรฐาน:

# 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

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?
terdon

คำตอบ:


16

สิ่งนี้อาจเกิดขึ้นได้หากแอปพลิเคชันเขียนโดยตรงไปยัง TTY แทนที่จะเป็น STDOUT หรือ STDERR

คุณสามารถเล่นกับพฤติกรรมนี้โดยเปรียบเทียบ 2 ตัวอย่างด้านล่าง

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

สังเกตุก่อนไม่แสดงอะไรเลย แต่อันที่สองทำ นั่นเป็นเพราะเราส่งการส่งออกโดยตรงไปยัง TTY /dev/nullและข้ามการเปลี่ยนเส้นทางไป

คุณสามารถแก้ไขสิ่งนี้โดยใช้ script

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

โดยพื้นฐานแล้วscriptยูทิลิตี้จะสร้าง tty ปลอมและเรียกใช้คำสั่งใน tty นั้น เอาต์พุตใด ๆ จากคำสั่งจะถูกส่งไปยัง STDOUT ซึ่งคุณสามารถเปลี่ยนเส้นทางได้ตามปกติ


ขอบคุณสำหรับตัวชี้ไปที่ "สคริปต์"! นั่นคือสิ่งที่ฉันต้องการเพื่อหลีกเลี่ยงการยืนยันที่ดื้อรั้นของ gpg / gpg2 โดยไม่อ่านจาก stdin
Eric

ขอบคุณ เอาการค้นหาเล็กน้อยมาที่นี่ น่าทึ่งที่มันเป็นคำถามที่ไม่เป็นที่นิยม (ฉันกำลังติดต่อกับ VLC)
Paul

script: illegal option -- c:( มีวิธีแก้ปัญหาอื่นที่คุณรู้จักหรือไม่?
Aaron
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.