รายงานความคืบหน้า / ข้อมูลการบันทึกเป็นของ stderr หรือ stdout หรือไม่?


75

มี POSIX, GNU อย่างเป็นทางการหรือแนวทางอื่น ๆ หรือไม่ว่ารายงานความคืบหน้าและข้อมูลการบันทึก (สิ่งต่าง ๆ เช่น "Doing foo; foo done") ควรพิมพ์ออกมาหรือไม่? โดยส่วนตัวแล้วฉันมักจะเขียนถึง stderr เพื่อที่ฉันจะสามารถเปลี่ยนเส้นทาง stdout และรับเอาท์พุทจริงของโปรแกรมเท่านั้น ฉันเพิ่งบอกว่านี่ไม่ใช่วิธีปฏิบัติที่ดีเนื่องจากรายงานความคืบหน้าไม่ใช่ข้อผิดพลาดจริง ๆ และควรพิมพ์เฉพาะข้อความข้อผิดพลาดไปยัง stderr

ทั้งสองตำแหน่งมีเหตุผลและแน่นอนว่าคุณสามารถเลือกอย่างใดอย่างหนึ่งขึ้นอยู่กับรายละเอียดของสิ่งที่คุณกำลังทำอยู่ แต่ฉันอยากจะรู้ว่ามีมาตรฐานที่ยอมรับกันโดยทั่วไปสำหรับเรื่องนี้หรือไม่ ฉันไม่สามารถค้นหากฎเฉพาะใน POSIX มาตรฐานการเข้ารหัสของ GNU หรือรายการแนวทางปฏิบัติที่ดีที่สุดอื่น ๆ

เรามีคำถามที่คล้ายกันสองสามข้อ แต่พวกเขาไม่ได้แก้ไขปัญหาที่แน่นอนนี้:

ดังนั้นมีกฎอย่างเป็นทางการว่ารายงานความคืบหน้าและข้อความที่ให้ข้อมูลอื่น ๆ (ซึ่งไม่ได้เป็นส่วนหนึ่งของผลลัพธ์ที่แท้จริงของโปรแกรม) ควรจะพิมพ์หรือไม่


26
การพิมพ์สปินเนอร์และสิ่งที่ชอบstdoutร่วมกันกับผลลัพธ์เป็นวิธีที่ปลอดภัยในการทำให้ผลลัพธ์นั้นไร้ประโยชน์ หากคุณต้องการนำผลลัพธ์ไปใช้กับโปรแกรมอื่นโปรแกรมดังกล่าวจะต้องแยกผลลัพธ์ออกจากสปินเนอร์ นอกจากนี้หากคุณเปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์คุณจะไม่สามารถเห็นสปินเนอร์ได้ IMHO
Satō Katsura

2
@SatoKatsura ใช่นั่นคือความเห็นของฉันและนั่นเป็นเหตุผลที่ฉันพิมพ์เช่น stderr อย่างไรก็ตาม CTO ของ บริษัท ที่ฉันทำงานด้วยรู้สึกว่าการพิมพ์ไปยัง stderr เป็นเครื่องบ่งชี้ว่ามีบางอย่างผิดปกติ ฉันทำค่อนข้างกล้าอ้างว่า POSIX Way®กำลังพิมพ์ไปยัง stderr และเขาเรียกฉันออกมา เนื่องจากเขามีประสบการณ์ 20 ปีกับฉันฉันอยากจะดูว่าฉันสามารถหาแนวทาง "ทางการ" บางประเภทได้หรือไม่
terdon

เช่นเดียวกับ Sato Katsura ที่กล่าวว่าstdoutจริงๆแล้วเป็นวิธีที่ปลอดภัยและถูกต้องในการ pringting เหยื่อและข้อความที่ให้ข้อมูลอื่น ๆ แต่ในขณะที่โปรแกรมเมอร์หลายคนบอกว่า ไม่ทำอะไรเลยถ้าทุกอย่างเรียบร้อยดี ' ดังนั้นในความเป็นจริง stderr มักจะใช้ในการทำเช่นนั้นเพราะความหมายที่คลุมเครือและ stdout อาจทำลายลำดับท่อ สำหรับคำแนะนำอย่างเป็นทางการ
Se ven

6
@ เจ็ดฉันคิดว่าคุณเข้าใจผิด; Sato กำลังบอกว่าการใช้ stdout นั้นไม่ปลอดภัย ("วิธีที่ปลอดภัยในการทำให้ผลลัพธ์ไม่ได้ผล")
Stephen Kitt

1
วิธีแก้ปัญหา one-size-fits-all หนึ่งที่เป็นไปได้คือใช้stderrเพื่อรายงานข้อผิดพลาดยกเว้นเมื่อใช้--verboseแฟล็กซึ่งรายงานความคืบหน้าของจุดจะถูกรวมไว้ด้วย
Gaurav

คำตอบ:


27

Posix กำหนดสตรีมมาตรฐานดังนี้ :

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

GNU C Libraryอธิบายลำธารมาตรฐานใกล้เคียงกัน:

ตัวแปร: FILE * stdout
เอาต์พุตสตรีมมาตรฐานซึ่งใช้สำหรับเอาต์พุตปกติจากโปรแกรม

ตัวแปร: FILE * stderr
สตรีมข้อผิดพลาดมาตรฐานซึ่งใช้สำหรับข้อความแสดงข้อผิดพลาดและการวินิจฉัยที่ออกโดยโปรแกรม

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

แทนที่จะส่งตัวบ่งชี้ความคืบหน้าโดยไม่มีเงื่อนไขไปยังสตรีมมาตรฐานทั้งสองสิ่งสำคัญคือต้องตระหนักว่าเอาต์พุตความคืบหน้านั้นเหมาะสมสำหรับสตรีมแบบโต้ตอบเท่านั้น โดยที่ในใจผมขอแนะนำให้เขียนเคาน์เตอร์ความคืบหน้าเฉพาะหลังจากตรวจสอบว่ากระแสนั้นเป็นแบบโต้ตอบ (เช่นด้วยisatty()) หรือเมื่อเปิดใช้งานอย่างชัดเจนโดยตัวเลือกบรรทัดคำสั่ง นั่นเป็นสิ่งสำคัญอย่างยิ่งสำหรับมาตรวัดความก้าวหน้าที่ต้องอาศัยพฤติกรรมการอัพเดทเทอร์มินัลเพื่อให้เหมาะสมเช่นแถบ% -complete

สำหรับข้อความแสดงความคืบหน้าอย่างง่าย ๆ บางข้อความ (“ การเริ่มต้น X” ... “ เสร็จสิ้นด้วย X”) มีเหตุผลมากกว่าที่จะรวมเอาท์พุทแม้สำหรับสตรีมแบบไม่โต้ตอบ ในกรณีที่พิจารณาวิธีการที่ผู้ใช้อาจโต้ตอบกับลำธารเช่นการค้นหาด้วยgrepหรือเพจด้วยหรือการตรวจสอบด้วยless ถ้ามันทำให้ความรู้สึกที่จะเห็นข้อความความคืบหน้าในบริบทเหล่านั้นพวกเขาจะง่ายขึ้นที่จะบริโภคจากtail -fstdout


ขอบคุณแนวทางของ GNU คือสิ่งที่ฉันตามมา อย่างไรก็ตามฉันรู้ว่าคำถามของฉันเป็นเรื่องเข้าใจผิดเล็กน้อย เมื่อผมกล่าวถึง "ความคืบหน้ารายงาน" ผมคิดว่าสิ่งที่ทั้งเหมือนN% doneและสิ่งที่ต้องการและdoing foo foo doneหลังควรถูกเก็บไว้เสมอเนื่องจากถูกใช้สำหรับการดีบั๊กเมื่อเปลี่ยนเส้นทางไปยังไฟล์ ดังนั้นข้อเสนอแนะของคุณในการตรวจสอบว่าสตรีมนั้นเป็นแบบอินเทอร์แอคทีฟไม่สามารถใช้ได้ (โดยทั่วไปเป็นความคิดที่ดีมาก)
terdon

อ่าขอบคุณสำหรับการชี้แจงที่แตกต่างกันเล็กน้อยจากสิ่งที่ชอบ“% เสร็จสมบูรณ์” และกัญชาเครื่องหมายแถบความคืบหน้าที่คุณเห็นในซอฟต์แวร์เช่นและcurl yumในกรณีนี้ฉันจะคิดว่าผู้ใช้จะต้องการโต้ตอบกับเอาต์พุตผ่านgrepหรือlessเครื่องมือที่คล้ายกันอย่างไร
Bradd Szonye

อัปเดตคำตอบเพื่อรวมคำชี้แจงข้างต้น
Bradd Szonye

71

POSIX กำหนดข้อผิดพลาดมาตรฐานเป็น

สำหรับการเขียนเอาต์พุตการวินิจฉัย

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


8
FWIW ใน Python stdoutเป็นบรรทัดบัฟเฟอร์ตามค่าเริ่มต้นในขณะที่ไม่มีบัฟเฟอร์stderrดังนั้นจึงstderrเป็นตัวเลือกที่เป็นธรรมชาติสำหรับการเขียนข้อความ / บาร์ / สปินเนอร์ที่ไม่มีการขึ้นบรรทัดใหม่ (ถ้าคุณเขียนข้อความเช่นนั้นstdoutคุณต้องทำให้สายการส่งออกความคืบหน้าของคุณยุ่งเหยิงด้วยstdout.flush()เพื่อให้มองเห็นได้)
PM 2Ring

12
@ PM2 แหวนที่ไม่เฉพาะเจาะจงกับ Python POSIX จะกำหนดสตรีมแบบนั้น
Stephen Kitt

4
@ PM2Ring: เมื่อเขียนถึงstdoutคุณต้องล้างข้อมูลแม้ว่าข้อความของคุณจะมีการขึ้นบรรทัดใหม่หากคุณต้องการให้รายงานความคืบหน้าของคุณปรากฏจริงตามเวลาจริงเมื่อเปลี่ยนเส้นทาง

@ Hurkyl Ah จุดที่ดี ฉันไม่ได้พิจารณาการเปลี่ยนเส้นทาง
PM 2Ring

1
@ พลังมากใช่มั้ย ไม่ได้ Ansible กลืนข้อความ stderr หากสถานะการออกคือ 0 การอ้างสิทธิ์นั้นเป็นเท็จ
Charles Duffy

10

POSIX มีรูปธรรมมากขึ้นเล็กน้อยเกี่ยวกับ "ข้อมูลการวินิจฉัย" ในเชลล์และยูทิลิตี้ , 1.4: ยูทิลิตี้คำอธิบายค่าเริ่มต้น (เหมืองของฉัน):

STDERR

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

รูปแบบของข้อความการวินิจฉัยสำหรับยูทิลิตี้ส่วนใหญ่จะไม่ได้รับการระบุ แต่การประชุมภาษาและวัฒนธรรมของข้อความการวินิจฉัยและข้อมูลที่มีรูปแบบที่ไม่ได้ระบุโดยปริมาณของ POSIX.1-2008 นี้ควรได้รับผลกระทบจากการตั้งค่า LC_MESSAGES และ [XSI] ] NLSPATH [ตัวเลือกท้าย]

เอาต์พุตข้อผิดพลาดมาตรฐานที่ระบุของยูทิลิตี้มาตรฐานจะต้องไม่ขึ้นอยู่กับการมีอยู่หรือค่าของตัวแปรสภาพแวดล้อมที่กำหนดในเล่มนี้ของ POSIX.1-2008 ยกเว้นตามที่กำหนดไว้ในไดรฟ์ข้อมูลของ POSIX.1-2008 นี้

พฤติกรรมเริ่มต้น : เมื่อส่วนนี้ถูกระบุว่าเป็น "ข้อผิดพลาดมาตรฐานจะใช้สำหรับข้อความการวินิจฉัยเท่านั้น" หมายความว่าเว้นแต่จะระบุไว้เป็นอย่างอื่นข้อความการวินิจฉัยจะถูกส่งไปยังข้อผิดพลาดมาตรฐานเฉพาะเมื่อสถานะทางออกบ่งชี้ว่ามีข้อผิดพลาด ที่เกิดขึ้นและใช้งานยูทิลิตี้ตามที่อธิบายไว้ในโวลุ่มนี้ของ POSIX.1-2008

เมื่อส่วนนี้แสดงรายการเป็น "ไม่ได้ใช้" หมายความว่าข้อผิดพลาดมาตรฐานจะไม่ถูกใช้เมื่อใช้ยูทิลิตี้ตามที่อธิบายไว้ในเล่มนี้ของ POSIX.1-2008

IANASL แต่ฉันตีความว่าหมายความว่า stderr จะมีเอาต์พุตเฉพาะถ้ายูทิลิตี้จะส่งคืนรหัสออกจากข้อผิดพลาด เนื่องจากสิ่งนี้ไม่ควรเป็นเหตุการณ์ปกติสำหรับการดำเนินการที่ประสบความสำเร็จจึงไม่ควรพิมพ์ข้อมูลความคืบหน้าโดยยูทิลิตี้ POSIX เว้นแต่ว่ามีข้อผิดพลาดเกิดขึ้น (เว้นแต่แน่นอนที่ระบุไว้เป็นอย่างอื่นเป็นต้น)


ฉันเข้าใจสิ่งนี้เป็นการอธิบายความหมายของส่วน "STDERR" ที่ให้ไว้ในข้อกำหนดของยูทิลิตี้ POSIX แต่ละอันไม่ใช่คำจำกัดความทั่วไปสำหรับการใช้งานข้อผิดพลาดมาตรฐาน ฉันไม่คิดว่า terdon กำลังเขียนโปรแกรม POSIX มาตรฐานที่นี่ ;-)
สตีเฟ่น Kitt

1
@StephenKitt ไม่ทำ I. แต่เขาโต้วาทีกับ CTO ของเขาที่บอกว่าเอาท์พุท stderr เป็นข้อบ่งชี้ของสิ่งที่ผิดพลาดและมาตรฐานที่สนับสนุนการเรียกร้องของเขาเป็นพฤติกรรมเริ่มต้น
muru

1
สนับสนุนเฉพาะการอ้างสิทธิ์ว่าเป็นพฤติกรรมเริ่มต้นสำหรับ POSIX ยูทิลิตี้และแม้แต่ในกรณีเฉพาะเท่านั้น (ยูทิลิตี้ที่ใช้วลีที่กล่าวถึง) ส่วนหนึ่งของ POSIX นี้ไม่ได้เป็นบรรทัดฐาน (AIUI) มันเป็นแม่แบบ: มันบอกวิธีการอ่านข้อมูลจำเพาะเกี่ยวกับยูทิลิตี้มันไม่ได้ระบุพฤติกรรมของยูทิลิตี้ โดยเฉพาะจะกำหนดความหมายของวลี "ข้อผิดพลาดมาตรฐานจะใช้สำหรับข้อความวินิจฉัยเท่านั้น" และ "ไม่ได้ใช้" ในส่วน "STDERR" ของข้อกำหนดคุณสมบัติของยูทิลิตี้ แต่ละยูทิลิตี้ระบุพฤติกรรมของมันและมันสามารถใช้วลีเหล่านั้นเป็นชวเลข
สตีเฟ่น Kitt

@StephenKitt ซึ่งไม่เปลี่ยนจุดของฉัน อรรถประโยชน์ POSIX อย่างใดอย่างหนึ่ง) ไม่ส่งออกไปยัง stderr, b) ใช้สำหรับข้อความวินิจฉัยหากมีสิ่งผิดปกติ c) ใช้สำหรับข้อความวินิจฉัยเท่านั้นแม้ว่าจะไม่มีอะไรผิดปกติและ d) ใช้เพื่อสิ่งอื่น ฉันบอกว่าพวกเขาใช้เพื่อการวินิจฉัยข้อความหากมีสิ่งผิดปกติ (a, b) เว้นแต่จะระบุไว้เป็นอย่างอื่น (c, d) ตอนนี้การเรียกร้องของฉันคือว่านี่เป็นค่าเริ่มต้นซึ่งชัดเจนว่าเป็นเพราะนั่นคือสาเหตุที่เป็นแม่แบบ
muru

2
ดีฉันจะพูดว่า "เว้นแต่ระบุเป็นอย่างอื่น" เป็นข้อแม้ที่ค่อนข้างสำคัญ: ยูทิลิตี้ POSIX สามารถระบุได้อย่างดีว่ามันส่งออกข้อมูลความคืบหน้าเกี่ยวกับข้อผิดพลาดมาตรฐานและมันจะเป็นไปตามมาตรฐาน คุณถูกต้องเป็นที่น่าสนใจว่า "พฤติกรรมเริ่มต้น" (ซึ่งยังคงต้องมีการกล่าวถึงเฉพาะในส่วนที่เกี่ยวข้อง) คือการใช้ข้อผิดพลาดมาตรฐานเฉพาะในกรณีที่รหัสทางออกยังแสดงข้อผิดพลาด; แต่มันไม่ จำกัด
สตีเฟ่น Kitt

7

โดยหลักการของการกีดกันมันสามารถไปที่ stderr เท่านั้น ใช่ฉันรู้ว่าคุณถามเกี่ยวกับข้อมูลจำเพาะอย่างเป็นทางการซึ่งฉันไม่สามารถนำเสนอคุณเกินกว่าลิงก์ไปยังข้อมูลจำเพาะ POSIX ที่กำหนดโดย Stephen Kitt ซึ่งระบุว่า stderr นั้นมีวัตถุประสงค์เพื่อการวินิจฉัย

จุดที่สำคัญกว่านั้นคือ stdin และ stdout มีฟังก์ชั่นที่ไม่สามารถพิมพ์รายงานความคืบหน้าไปยัง stdout ได้แน่นอนว่ามันจะสร้างลำดับของท่อซึ่งในคำสั่ง Unix shell ไม่ได้เป็นเพียงผลข้างเคียงเท่านั้น .

ดังนั้น. ไม่มีอะไรยกเว้น "payload" ที่แท้จริงของโปรแกรมของคุณที่เป็นของ stdout หากโปรแกรมของคุณไม่มีเอาต์พุตไม่ควรไปที่ stdout สิ่งนี้ทำให้ stderr สำหรับทุกอย่างรวมถึงรายงานความคืบหน้า

จริงอยู่ที่นี่ปล่อยให้เป็นรู - มันอาจจะดีถ้ามี "stdfluff" หรืออะไรทำนองนั้นที่ไม่ใช้สำหรับเอาท์พุทหรือข้อผิดพลาด แต่รายงานความคืบหน้า ในความเป็นจริงไม่มีสิ่งใดขัดขวางไม่ให้คุณทำเช่นนั้นคุณสามารถพิมพ์ความคืบหน้าของคุณไปยังไฟล์ descriptor 3 ตัวอย่าง:

$ perl -e 'open($fd, ">", "/dev/fd/3"); print $fd "hello\n"'

สิ่งนี้ไม่สร้างผลลัพธ์ (*)

$ perl -e 'open($fd, ">", "/dev/fd/3"); print $fd "hello\n"'  3>&1
hello

นี่จะพิมพ์ไปยัง fd-3 ซึ่งจะถูกเปลี่ยนเส้นทางไปยัง stdout

(*) ตัวอย่างแรกไม่สร้างเอาต์พุต แต่ยังคงดึงข้อมูลได้ไกล ความopenล้มเหลวและ$!จะมีno such file or directory; เพียงใช้สิ่งนี้เป็นตัวอย่างแน่นอนว่าไม่ควรใช้อย่างนี้อย่างจริงจัง ในโปรแกรมจริงหากคุณต้องการใช้เส้นทางนี้คุณสามารถทดสอบว่า/dev/fd/3ใช้งานได้หรือไม่และใช้เป็นคำใบ้ว่าจะเปิดใช้งานรายงานความคืบหน้าของคุณหรือไม่ คุณต้องทำมันให้เร็วเพื่อที่คุณจะได้ไม่สับสนopenกับไฟล์จริงและ ...


คือfd-3อะไร ฟลอปปีดิสก์ที่สาม
Peter Mortensen

file descriptor 3, @PeterMortensen
AnoE

-1

ข้อความการใช้งานควรไปที่ stdout หากผู้ใช้เรียกใช้ด้วย--helpและไปที่ stderr หากพวกเขาทำผิดพลาด การพิมพ์ไปยัง stderr โดยไม่มีเงื่อนไขนั้นน่ารังเกียจเพราะทำให้การดูด้วยเพจเจอร์ / grep / etc ทำได้ยากขึ้น

นอกจากนี้ฉันขอแนะนำวิธีที่สาม: เปิด / dev / tty สำหรับรายงานความคืบหน้า / สปินเนอร์ / ฯลฯ


6
ขออภัย แต่นี่ไม่ได้ตอบคำถาม ฉันขอเฉพาะแนวทางอย่างเป็นทางการไม่ใช่ความเห็น ไม่ว่าในกรณีใดแม้ว่าฉันจะขอความเห็นคุณก็กำลังตอบคำถามอื่น ฉันไม่ได้พูดถึง--helpหรือช่วยเหลือข้อความเลย โปรดอ่านคำถามอีกครั้ง
terdon

คุณพูดถึง "ข้อความการใช้งาน" ฉันคิดว่ามันเป็นส่วนหนึ่งของคำถามของคุณมากกว่าแค่ชื่อของคำถามอื่นที่คุณเชื่อมโยง ฉันไม่เข้าใจว่าทำไมคุณถึงคิดว่า "มีแนวทางปฏิบัติ" สำหรับเรื่องนี้ ใครจะมีอำนาจที่จะทำให้พวกเขา?
Random832

3
ฉันไม่ทราบว่าพวกเขาทำนั่นคือเหตุผลที่ฉันถาม และสำหรับทางการมาตรฐาน POSIX มีข้อกำหนดสำหรับรายละเอียดนาทีต่างๆเกี่ยวกับวิธีการทำงานของโปรแกรม รวมทั้งสตีเฟ่นชี้ให้เห็นในคำตอบของเขาข้อเสนอแนะที่คลุมเครือสำหรับสิ่งที่ควรจะไปที่ stderr มาตรฐานการเข้ารหัสของ GNU อาจมีบางอย่างที่คล้ายกัน โดยทั่วไปกลุ่มใด ๆ ที่มีการใช้งานในและผลิตสำหรับระบบนิเวศ * ระวังอาจจะมีมาตรฐานที่ฉันจะสนใจใน.
terdon

@terdon คุณจะโอเคกับตัวอย่างของโปรแกรมที่มีอยู่ทำอะไร? curl, wget และ pv ทั้งหมดใช้ stderr โดยที่ wget และ pv ทำให้มันเป็นเงื่อนไขในการเป็น tty และ curl ทำให้มันมีเงื่อนไขใน stdout ไม่ใช่ tty
Random832

4
นอกจากนี้ดูเหมือนว่า CTO ของคุณคิดว่าโปรแกรมโทรควรตอบสนองต่อการปรากฏตัวของข้อมูลบน stderr ซึ่งหมายความว่ามีข้อผิดพลาดเกิดขึ้นแทนที่จะมองที่สถานะทางออก นี่เป็นวิธีปฏิบัติที่ไม่ดีอย่างแน่นอน (และยากต่อการเขียนมากกว่าการตรวจสอบสถานะทางออก) และอาจเป็นมุมที่ดีกว่าที่จะโน้มน้าวเขา
Random832
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.