คำถามติดแท็ก stderr

ข้อผิดพลาดมาตรฐานคือเอาต์พุตสตรีมอื่นที่มักใช้โดยโปรแกรมเพื่อส่งออกข้อความแสดงข้อผิดพลาดหรือการวินิจฉัย

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

6
ฉันสามารถกำหนดค่าเปลือกของฉันเพื่อพิมพ์ STDERR และ STDOUT ในสีที่ต่างกันได้หรือไม่?
ฉันต้องการตั้งค่าเทอร์มินัลของฉันเพื่อให้stderrพิมพ์ในสีที่แตกต่างกว่าstdout; อาจจะเป็นสีแดง นี่จะทำให้ง่ายต่อการบอกความแตกต่าง มีวิธีกำหนดค่านี้.bashrcไหม ถ้าไม่เป็นไปได้ไหม หมายเหตุ : คำถามนี้รวมกับอีกว่าขอให้stderr, stdout และผู้ใช้ป้อนก้องจะเป็นผลลัพธ์ใน3 สีที่แตกต่างกัน คำตอบอาจตอบคำถามใดคำถามหนึ่ง

2
ระงับข้อความ stderr ในสคริปต์ทุบตี
พิจารณาชื่อสคริปต์ต่อไปนี้ (โง่เล็กน้อย) 'test1.sh': #/bin/bash # sleep 10 & echo sleep pid = $! pkill sleep เมื่อฉันเรียกใช้ฉันไม่เพียง แต่เอาท์พุทของเสียงก้องเท่านั้น แต่ยังรายงานการตายของการนอนหลับบน stderr ด้วย: $ ./test1.sh sleep pid = 3551 ./test1.sh: line 5: 3551 Terminated sleep 10 ในกรณีนี้ฉันต้องการระงับการพิมพ์ไปยัง stderr ฉันรู้ว่าฉันสามารถทำได้ในบรรทัดคำสั่งเช่นเดียวกับใน: $ ./test1.sh 2> /dev/null ... แต่มีวิธีที่จะระงับมันจากภายในสคริปต์หรือไม่ (ฉันรู้ว่าฉันสามารถตัดมันในสคริปต์ที่สองและให้ wrapper เปลี่ยนเส้นทาง แต่ต้องมีบางสิ่งที่ง่ายกว่า ... )

5
วิธีเปลี่ยนเส้นทาง stdout ไปยังไฟล์และ stdout + stderr ไปยังไฟล์อื่นได้อย่างไร
ฉันจะประสบความสำเร็จได้อย่างไร cmd >> file1 2>&1 1>>file2 นั่นคือ stdout และ stderr ควรเปลี่ยนเส้นทางไปที่หนึ่งไฟล์ (file1) และ stdout เท่านั้น (file2) ควรเปลี่ยนเส้นทางไปที่อื่น (ทั้งในโหมดต่อท้าย)?

4
แอปพลิเคชั่น X เตือนว่า "ไม่สามารถเชื่อมต่อกับบัสการเข้าถึงได้" บน stderr
ดูเหมือนว่าทุกแอปพลิเคชันจากเทอร์มินัลจะให้คำเตือนและข้อความแสดงข้อผิดพลาดถึงแม้ว่ามันจะทำงานได้ดีก็ตาม Emacs: ** (emacs:5004): WARNING **: Couldn't connect to accessibility bus: Failed to connect to socket /tmp/dbus-xxfluS2Izg: Connection refused Evince: ** (evince:5052): WARNING **: Couldn't connect to accessibility bus: Failed to connect to socket /tmp/dbus-xxfluS2Izg: Connection refused (evince:4985): Gtk-CRITICAL **: gtk_widget_show: assertion 'GTK_IS_WIDGET (widget)' failed (evince:4985): Gtk-CRITICAL **: gtk_widget_show: assertion …
30 terminal  x11  gtk  stderr  bugs 

3
การเปลี่ยนเส้นทาง stdout และ stderr ไปยังไฟล์เดียวกันนั้นปลอดภัยหรือไม่โดยไม่มีการคัดลอกไฟล์ descriptor?
ฉันเริ่มต้นในไดเรกทอรีว่างเปล่า $ touch aFile $ ls aFile จากนั้นฉันก็lsโต้เถียงกันสองข้อข้อหนึ่งข้อหนึ่งไม่ได้อยู่ในไดเรกทอรีนี้ outputฉันเปลี่ยนเส้นทางทั้งลำธารส่งออกไปยังไฟล์ชื่อ ฉันใช้>>เพื่อหลีกเลี่ยงการเขียนพร้อมกัน $ ls aFile not_exist >>output 2>>output $ cat output ls: cannot access 'not_exist': No such file or directory aFile ซึ่งดูเหมือนว่าจะทำงาน มีอันตรายกับวิธีนี้หรือไม่?

3
nohup: ละเว้นอินพุตและเปลี่ยนทิศทาง stderr ไปที่ stdout
ฉันเริ่มต้นแอปพลิเคชันของฉันในพื้นหลังโดยใช้nohupตามที่ระบุไว้ด้านล่าง - root@phx5qa01c:/bezook# nohup java -jar ./exhibitor-1.5.1/lib/exhibitor-1.5.1-jar-with-dependencies.jar -c file --fsconfigdir /opt/exhibitor/conf --hostname phx5qa01c.phx.qa.host.com > exhibitor.out & [1] 30781 root@phx5qa01c:/bezook# nohup: ignoring input and redirecting stderr to stdout แต่ทุกครั้งที่ฉันเห็นข้อความนี้ - nohup: ignoring input and redirecting stderr to stdout จะมีปัญหาใด ๆ หรือไม่หากฉันเห็นข้อความนี้ มันหมายถึงอะไรและฉันจะหลีกเลี่ยงได้อย่างไร


2
ข้อความ 'การแบ่งกลุ่มข้อผิดพลาด' มาภายใต้ STDERR หรือไม่
ฉันเรียกใช้ไฟล์ปฏิบัติการได้ bash ./code > log มันแสดงข้อความผิดพลาดเป็นครั้งคราวใน terminal ในขณะที่คำสั่ง printf ทั้งหมดเข้าไปในล็อกไฟล์ ฉันเรียกใช้อีกครั้งเหมือนด้านล่าง ./code >& log ตอนนี้ข้อความแสดงข้อผิดพลาดเป็นครั้งคราวก็เข้าสู่ระบบด้วยเช่นกัน แต่หากมีความผิดพลาดในการแบ่งส่วนมันจะยังคงปรากฏบนขั้ว ทำไม? จะทำให้ข้อความSegmentation fault (core dumped)เข้าไปในล็อกไฟล์ได้อย่างไร? ผู้ใช้ $ bash - รุ่น GNU ทุบตี, รุ่น 4.2.24 (1) - ปล่อย (i686-pc-linux-gnu)

1
เอาต์พุตของคำสั่งไม่ได้อยู่ใน stderr หรือ stdout
ฉันพบปัญหานี้แล้วฉันจึงสงสัยว่าจะเป็นไปได้อย่างไร คำสั่งรันแบบมาตรฐาน: # 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 …
16 shell  stdout  stderr 

3
เมื่อใดที่จะใช้การเปลี่ยนเส้นทางไปยัง stderr ในเชลล์สคริปต์
ฉันรู้ว่าโปรแกรมอรรถประโยชน์ที่ทำงานได้ดีเช่นข้อความgrep "ปกติ" ไปยัง stdout และข้อความแสดงข้อผิดพลาดไปยัง stderr $ grep '^foo' file1 file2 file1:foo grep: file2: No such file or directory เมื่อฉันเขียนเชลล์สคริปท์ตัวเองฉันมักจะพบว่ามันยากที่จะตัดสินใจว่าเอาต์พุตใดและข้อความใดที่ฉันควรแสดงบน stderr หรือถ้าฉันควรจะใส่ใจ ฉันต้องการทราบเกี่ยวกับแนวปฏิบัติที่ดี: เมื่อใดที่มีการเปลี่ยนเส้นทางข้อความไปยัง stderr ที่ถูกเรียกร้องและสมเหตุสมผลและเมื่อใด "ขึ้นอยู่กับ" แน่นอน แต่คุณมีความเข้าใจที่จะช่วยฉันตัดสินใจเหล่านี้หรือไม่ เพื่อให้คำถามอัตนัยนี้สอดคล้องกับรูปแบบฉันต้องการสนับสนุนคำตอบที่ตอบว่า "ทำไม" และได้รับการแจ้งจากประสบการณ์และหากได้รับการสนับสนุนจากข้อเท็จจริง

2
สิ่งที่ป้องกันไม่ให้ stdout / stderr จาก interleaving?
ว่าฉันใช้กระบวนการบางอย่าง: #!/usr/bin/env bash foo & bar & baz & wait; ฉันรันสคริปต์ด้านบนดังนี้: foobarbaz | cat เท่าที่ฉันสามารถบอกได้ว่าเมื่อใดก็ตามที่กระบวนการเขียนไปยัง stdout / stderr ผลลัพธ์ของมันจะไม่แทรกสอด - แต่ละบรรทัดของ stdio นั้นดูเหมือนจะเป็นอะตอม มันทำงานอย่างไร ยูทิลิตี้อะไรควบคุมวิธีแต่ละอะตอมเป็นอะตอม
14 shell  osx  stdout  output  stderr 

2
ฉันควรส่งชื่อโปรแกรมเมื่อคำเตือนหรือข้อผิดพลาดเกิดขึ้นหรือไม่
หากฉันเขียนสคริปต์หรือโปรแกรมฉันควรส่งออกไปยังชื่อ stderr พร้อมกับคำเตือนหรือข้อความแสดงข้อผิดพลาดหรือไม่? ตัวอย่างเช่น: ./script.sh: Warning! Variable "var" lowered down to 10. หรือ: ./prog.py: Error! No such file: "file.cfg". ฉันเข้าใจว่าโดยทั่วไปแล้วมันเป็นเพียงเรื่องของรสนิยม (โดยเฉพาะถ้าคุณเขียนของคุณเองเพื่อตัวเอง) แต่ฉันสงสัยว่ามีอะไรที่ธรรมดาบ้างไหม? ฉันเชื่อว่ายูทิลิตี UNIX / Linux ส่วนใหญ่เขียนชื่อของตัวเองเมื่อมีบางสิ่งเกิดขึ้นดังนั้นจึงเป็นเรื่องที่ดี แต่มีแนวทางหรือกฎที่ไม่ได้พูดวิธีการทำเช่นนั้นและไม่ทำอย่างไร ตัวอย่างเช่นไม่แนะนำให้ติดตั้งไบนารีภายใต้/usr/bin/แทน/usr/local/bin/หรืออย่างอื่น มีกฎที่คล้ายกันเกี่ยวกับการส่งออกไปยัง stderr? ฉันควรเขียนชื่อตามด้วยโคลอนหรือไม่? หรือเพียงแค่ "เตือน!" และ "ผิดพลาด!" คำ? ฉันไม่พบอะไรเลย แต่อาจมีบางคนบอกให้ฉันรู้ได้ คำถามนี้เป็นคำถามเล็กน้อยเกี่ยวกับวิธีปฏิบัติในการเขียนโปรแกรม แต่ฉันคิดว่ามันเหมาะสมกว่าที่นี่มากกว่าในstackoverflowเนื่องจากเป็นเรื่องเกี่ยวกับประเพณี UNIX / Linux และไม่ใช่โปรแกรมทั่วไป

2
(และทำไม) ใช้ stderr สำหรับทั้งการอ่านและการเขียนได้อย่างไร
ตามคำตอบนี้โดย schily , lessอ่านคำสั่งนำทางจาก stderr /dev/ttyถ้ามันไม่สามารถที่จะเปิด ดูเหมือนว่าจะทำให้งงงวยเนื่องจากฉันไม่เคยเห็นสิ่งใดที่เขียนไปยังสตรีม stderr ของโปรแกรมอื่นและฉันไม่รู้ว่าฉันจะทำอย่างไรให้สำเร็จ จุดประสงค์ของ stderr ที่เปิดสำหรับการอ่านและการเขียนคืออะไร? และถ้ามันมีประโยชน์ฉันจะใช้มันกับระบบที่ทันสมัยได้อย่างไร? (มีไวยากรณ์อาร์เคนบางอย่างเพื่อไพพ์บางสิ่งลงใน stderr แทนที่จะเป็น stdin หรือไม่?)
12 pipe  stderr 

1
เหตุใดจึงสามารถใช้คำสั่งเดียวกันสร้างเอาต์พุตมากขึ้นใน tty มากกว่าใน pts / gnome-terminal
gnome ขั้ว: $ sudo update-grub [sudo] password for user: Generating grub configuration file ... Found background image: .background_cache.png Found linux image: /boot/vmlinuz-3.16.0-4-amd64 Found initrd image: /boot/initrd.img-3.16.0-4-amd64 done tty1 ตามที่เข้าถึงได้โดยCtrl+ Alt+ F1: $ sudo update-grub [sudo] password for user: Generating grub configuration file ... Found background image: .background_cache.png Found linux image: …

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