เมื่อใดที่ใช้สตรีมข้อผิดพลาดมาตรฐานในแอปพลิเคชันบรรทัดคำสั่ง


9

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

โดยเฉพาะอย่างยิ่งคำถามที่ฉันกังวลตอนนี้คือว่าจะใช้stdoutหรือstderrเมื่อผู้ใช้เรียกโปรแกรมด้วยข้อโต้แย้งที่ผิดกฎหมาย อย่างไรก็ตามคำตอบที่ครอบคลุมมากขึ้นได้รับการชื่นชมอย่างมากเพราะนี่จะไม่เป็นกรณีเดียวที่จำเป็นต้องมีกฎที่ชัดเจนในการเขียนโปรแกรมที่ทำงานในลักษณะที่ผู้ใช้คาดหวัง


มันไม่เป็นไรสำหรับข้อความแสดงข้อผิดพลาดเหล่านั้นที่จะนำมาปะปนกับเอาต์พุตปกติ? เช่นโปรแกรมเป็นตัวกรองข้อมูลหรือไม่
thrig

มันไม่ใช่ตัวกรองข้อมูล มันยังไม่โต้ตอบ ผู้ใช้เรียกมันว่ามีข้อโต้แย้ง (ซึ่งเป็นเส้นทางไฟล์) โปรแกรมทำงานเปลี่ยนไฟล์เหล่านั้นพิมพ์ข้อความสองสามข้อความไม่ควรพิมพ์ข้อความผิดพลาดและยกเลิก
UTF-8

คำตอบ:


15

ใช่แสดงข้อความstderrเมื่อมีการใช้อาร์กิวเมนต์ที่ไม่ถูกต้อง และหากเป็นสาเหตุให้แอปพลิเคชันออกให้ออกด้วยสถานะออกที่ไม่ใช่ศูนย์

คุณควรใช้สตรีมข้อผิดพลาดมาตรฐานสำหรับข้อความการวินิจฉัยหรือการโต้ตอบกับผู้ใช้ ข้อความวินิจฉัยรวมถึงข้อความแสดงข้อผิดพลาดคำเตือนและข้อความอื่น ๆ ที่ไม่ได้เป็นส่วนหนึ่งของเอาต์พุตของยูทิลิตี้เมื่อทำงานอย่างถูกต้อง ("ถูกต้อง" หมายถึงไม่มีอะไรพิเศษเกิดขึ้นเช่นไฟล์ที่ไม่ถูกค้นพบ

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

ต่อไปนี้มาจากบล็อกโพสต์ในหัวข้อนี้:

นี่เป็นคำพูดจาก Doug McIllroy ผู้ประดิษฐ์ท่อ Unix อธิบายว่าทำไมมันstderrถึงเป็นอย่างนั้น 'v6' หมายถึงเวอร์ชั่นเฉพาะของระบบปฏิบัติการ Unix ดั้งเดิมที่เปิดตัวในปี 1975

โปรแกรมทั้งหมดวางการวินิจฉัยบนเอาต์พุตมาตรฐาน สิ่งนี้ทำให้เกิดปัญหาเสมอเมื่อเอาท์พุทถูกเปลี่ยนเส้นทางไปยังไฟล์ แต่ก็ไม่สามารถทนได้เมื่อเอาต์พุตถูกส่งไปยังกระบวนการที่ไม่สงสัย อย่างไรก็ตามไม่เต็มใจที่จะละเมิดความเรียบง่ายของรูปแบบมาตรฐานอินพุตและเอาต์พุตมาตรฐานผู้คนยอมรับสถานการณ์นี้ผ่าน v6 หลังจากนั้นไม่นานเดนนิสริตชี่ตัดปม Gordian ด้วยการแนะนำข้อผิดพลาดมาตรฐาน นั่นไม่เพียงพอ ด้วยการวินิจฉัยท่ออาจมาจากหลาย ๆ โปรแกรมที่ทำงานพร้อมกัน การวินิจฉัยที่จำเป็นในการระบุตัวเอง
- Doug McIllroy, "นักวิจัย UNIX Reader: ข้อเขียนที่ตัดตอนมาจากคู่มือโปรแกรมเมอร์, 1971-1986"

หากต้องการ "ระบุตนเอง" หมายถึงเพียงแค่พูดว่า "เฮ้! ฉันกำลังพูดถึงอยู่นี่มันผิดพลาด: [... ]":

$ ls nothere
ls: nothere: No such file or directory

การทำเช่นนี้stderrเป็นที่นิยมเพราะมันอาจจะเป็นอย่างอื่นจะอ่านอะไรก็ตามที่ได้อ่านบนstdout( แต่เราไม่ได้ทำอย่างนั้นด้วยlsล่ะค่ะเราทำ?)


ดังนั้นเมื่อคุณถามผู้ใช้เมื่อแอปพลิเคชันทำงานคุณควรพิมพ์คำถามบน stderr? นั่นไม่ได้เสียงที่ถูกต้อง คุณมีแหล่งที่มาหรือไม่ สิ่งนี้ใช้ได้กับแอปพลิเคชันที่มีเอาต์พุตไม่ใช่คำถามและการตอบกลับเท่านั้น (ผลลัพธ์ที่ผู้ใช้อาจต้องการไพพ์)
UTF-8

@ UTF-8 ข้อความในคำถามควรถูกพิจารณาว่าเป็นส่วนหนึ่งของผลลัพธ์ของโปรแกรมหรือไม่ สิ่งที่เกี่ยวกับสิ่งที่ผู้ใช้พิมพ์มา? ฉันไม่คิดว่ามันควรจะเป็น (เช่นเดียวกับกระสุนไม่คิดว่าควรจะเป็น) แต่อาจจะขึ้นอยู่กับแอพพลิเคชั่น
Kusalananda

1
ขอบคุณสำหรับการแก้ไข ในระหว่างนี้ฉันตรวจสอบพฤติกรรมของแอปพลิเคชั่นมาตรฐานและพวกมันทำงานเหมือนที่คาดไว้ว่าพวกมันจะประพฤติตนหลังจากอ่านคำตอบของคุณ
UTF-8

@ UTF-8 คุณอาจพบคำถาม & คำตอบที่เกี่ยวข้อง: unix.stackexchange.com/q/331611/22222
terdon

6

จากข้อมูลจำเพาะ POSIXสำหรับสตรีมมาตรฐาน:

เมื่อเริ่มต้นโปรแกรมจะต้องกำหนดสามสตรีมล่วงหน้าและไม่จำเป็นต้องเปิดอย่างชัดเจน: อินพุตมาตรฐาน (สำหรับการอ่านอินพุตดั้งเดิม), เอาต์พุตมาตรฐาน (สำหรับการเขียนเอาต์พุตทั่วไป) และข้อผิดพลาดมาตรฐาน (สำหรับการเขียนเอาต์พุตการวินิจฉัย )

ในคำอื่น ๆ stderrข้อผิดพลาดข้อมูลการแก้จุดบกพร่องและสิ่งที่ตกอยู่ในประเภทการวินิจฉัยจะเข้าสู่

ดูคำถามที่เกี่ยวข้องสำหรับข้อมูลเพิ่มเติม: รายงานความคืบหน้า / ข้อมูลการบันทึกอยู่ใน stderr หรือ stdout หรือไม่

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