ข้อความ 'การแบ่งกลุ่มข้อผิดพลาด' มาภายใต้ STDERR หรือไม่


17

ฉันเรียกใช้ไฟล์ปฏิบัติการได้ bash

./code > log

มันแสดงข้อความผิดพลาดเป็นครั้งคราวใน terminal ในขณะที่คำสั่ง printf ทั้งหมดเข้าไปในล็อกไฟล์ ฉันเรียกใช้อีกครั้งเหมือนด้านล่าง

./code >& log

ตอนนี้ข้อความแสดงข้อผิดพลาดเป็นครั้งคราวก็เข้าสู่ระบบด้วยเช่นกัน แต่หากมีความผิดพลาดในการแบ่งส่วนมันจะยังคงปรากฏบนขั้ว ทำไม? จะทำให้ข้อความSegmentation fault (core dumped)เข้าไปในล็อกไฟล์ได้อย่างไร?


ผู้ใช้ $ bash - รุ่น

GNU ทุบตี, รุ่น 4.2.24 (1) - ปล่อย (i686-pc-linux-gnu)

คำตอบ:


14

ข้อผิดพลาดในการแบ่งกลุ่มเป็นสัญญาณถ้าคุณไม่ได้จับสิ่งนี้โปรแกรมของคุณจะถูกยกเลิกและเชลล์ของคุณจะพิมพ์สิ่งนี้ไปยัง stderr (แทนที่จะเป็น stderr ของโปรแกรม)

เป็นไปได้ที่โปรแกรมหรือเชลล์ของคุณจะดำเนินการบางอย่างเมื่อเกิดเหตุการณ์นี้โดยโปรแกรมจับสัญญาณหรือเชลล์ของคุณจับสัญญาณ SIGCHILD จากนั้นตรวจสอบสถานะการออกของบุตรหลานของคุณ


1
@ user13107help trap
Carlos Campderrós

2
ได้. เข้าใจแล้ว หากใครสนใจนี่คือสิ่งที่ฉันได้วางpastebin.com/QyeJYYHC
13107

1
เปลือกtrapสัญญาณคำสั่งกับดักส่งไปยังเปลือก ดังนั้นจะไม่สามารถจับสิ่งที่ถูกส่งไปยังโปรแกรมของคุณได้
Derobert

1
@ warl0ck เป็นไปได้ที่จะจับ segfault ในลักษณะเดียวกับที่คุณจับสัญญาณใด ๆ อย่างไรก็ตามสิ่งนี้อาจนำไปสู่พฤติกรรมที่ไม่ได้กำหนด แต่ถ้าคุณรู้ว่าคุณกำลังทำอะไรอยู่คุณอาจตายได้อย่างฉลาด OP ต้องการพิมพ์ไปยัง stderr ในกรณีนี้การจับ segfault และการพิมพ์นั้นปลอดภัย
cjh

1
@ warl0ck: ทำได้ แต่เป็นความคิดที่แย่มากที่จะทำทุกอย่างในตัวจัดการ แต่ให้ล็อกและออก มีบางกรณีการใช้งานพิเศษว่า
Linuxios

19

ข้อความ“ การแบ่งเซกเมนต์ผิดพลาด” ถูกพิมพ์ไปยัง stderr แต่เป็นข้อผิดพลาดมาตรฐานของเชลล์ไม่ใช่ข้อผิดพลาดมาตรฐานของโปรแกรม เชลล์พิมพ์ข้อความนี้เมื่อตรวจพบว่าโปรแกรมหยุดทำงานเนื่องจากสัญญาณ

คุณสามารถปิดเสียงข้อความโดยเปลี่ยนเส้นทาง stderr รอบส่วนของเชลล์สคริปต์ที่รันโปรแกรม:

{ ./code; } >&log
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.