ไม่แสดงเอาต์พุตยกเว้นโค้ดออกที่ไม่ใช่ศูนย์


19

อะไรคือวิธีที่ดีที่สุดในการระงับเอาต์พุต (stdout และ stderr) ยกเว้นว่าโปรแกรมออกด้วยรหัสที่ไม่ใช่ศูนย์ ฉันกำลังคิด:

quiet_success()
{
  file=$(mktemp)
  if ! "$@" > "$file" 2>&1; then
    cat "$file"
  fi
  rm -f "$file"
}

และวิ่งquiet_success my_long_noisy_script.shแต่ฉันไม่แน่ใจว่ามีวิธีที่ดีกว่า ฉันรู้สึกว่าสิ่งนี้จะต้องเป็นสิ่งที่คนอื่น ๆ ต้องทำ

สำหรับบริบทฉันต้องการเพิ่มสคริปต์ cron ของฉันเพื่อที่ฉันจะได้รับอีเมลทุกอย่างหากพวกเขาล้มเหลว แต่ไม่ใช่ถ้าพวกเขาทำไม่ได้


นี่ควรเป็นพฤติกรรมเริ่มต้นของคำสั่งส่วนใหญ่ (ไม่มีผลลัพธ์เมื่อสำเร็จ) ถ้าไม่มีสิ่งแรกที่ต้องทำคือมองหาตัวเลือก / สวิตช์เพื่อเปิดใช้งานลักษณะการทำงาน ความล้มเหลวของคุณคือแนวทางที่ถูกต้อง ด้านหมายเหตุ: ฉันสมมติว่าคุณโพสต์หลอกรหัสเพราะมันไม่ได้เป็นshไวยากรณ์ที่ถูกต้องจริงและลำดับการเปลี่ยนเส้นทางของคุณเป็นไปข้างหลัง (ทำ> "$file" 2>&1และใช้คำพูดมากขึ้น)
jw013

ใช่ฉันเพิ่งพิมพ์มันขึ้นมาในคำถาม ใช้คำแนะนำของคุณและฉันเห็นด้วยคำสั่งควรจะรับผิดชอบ แต่นั้นอนิจจา ...
dimo414

เพียงบันทึกไวยากรณ์: ไม่จำเป็นต้องใส่วงเล็บล้อมรอบคำสั่ง
จัดการ

คำตอบ:


14

คุณจะต้องบัฟเฟอร์เอาท์พุทที่ไหนสักแห่งไม่ว่าจะเกิดอะไรขึ้นเนื่องจากคุณต้องรอให้รหัสทางออกรู้ว่าต้องทำอะไร สิ่งนี้น่าจะง่ายที่สุด:

$ output=`my_long_noisy_script.sh 2>&1` || echo $output

โปรดทราบว่าถ้าคุณใช้set -o xtraceในเชลล์สคริปต์ของคุณเอาต์พุตทั้งหมดจะมีอีกครั้งซึ่งเป็นส่วนหนึ่งของการบันทึกรายละเอียดของการกำหนดoutput=...:-) ในกรณีนี้อาจใช้งานchronicได้ดีกว่า
Jan-Philip Gehrcke

11

moreutilsแพคเกจประกอบด้วยโปรแกรมchronicเพื่อการนี้ คุณเพียงแค่เรียกว่าชอบ

chronic my_program args ...

มีประโยชน์มากในงาน cron


3
อย่าเป็นเหมือนฉันและความผิดพลาดchronicสำหรับcronicซึ่งเป็นโปรแกรมที่คล้ายกันว่าการส่งออกไม่ใส่เว้นแต่คำสั่งที่มีอยู่ด้วยรหัสที่ไม่ใช่ศูนย์หรือผลิตออกข้อผิดพลาดมาตรฐาน
Witiko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.