ส่งเอาต์พุตไปที่ / dev / stderr vs. > & 2


11

ในสคริปต์ข้อผิดพลาดมักจะถูกส่งไปยัง file descriptor 2 ด้วย&2เช่น:

echo "error" >&2

บางครั้ง/dev/stderrใช้แทน:

echo "error" > /dev/stderr 

มองไปที่/dev/stderrฉันเห็นว่ามันเป็นเพียง symlink ไป/proc/self/fd/2ซึ่งในทางกลับกันคือ symlink ไปที่/dev/pts/5(ใน terminal ปัจจุบันของฉัน)

ดูเหมือนซับซ้อนกว่าเล็กน้อย มีเหตุผลบางอย่างที่อยู่เบื้องหลังหรือไม่

มีการใช้/dev/stderrและ&2เทียบเท่า?

เป็นที่ชื่นชอบมากกว่าคนอื่น ๆ ?


3
echo "error" >2สร้างไฟล์ที่มีชื่อและเนื้อหา2 error
Cyrus

เกี่ยวข้อง: unix.stackexchange.com/q/36403/38906
cuonglm

ผมเห็นการแก้ไขของฉันแนะนำ & 2 แทน 2. คำถามของคุณจริงเกี่ยวกับการใช้ของ>2หรือ>&2?
Jeff Schaller

คำตอบ:


13

อุปกรณ์พิเศษเฉพาะ/dev/stderrระบบในขณะที่ตัวอธิบายไฟล์2(ไม่ใช่อุปกรณ์พิเศษ/proc/self/fd/2) สามารถพกพาได้ หากคุณต้องการเขียนรหัสที่ไม่ใช่พกพาอุปกรณ์พิเศษเหล่านั้นเป็นจุดเริ่มต้นที่ดี

มีไม่กี่ระบบอยู่กับ/dev/stderr: ลินุกซ์ของหลักสูตรและOSX แต่ OSX ไม่มี/procระบบแฟ้มและการเชื่อมโยงไปยัง/dev/stderr/dev/fd/2

อ่านเพิ่มเติม:


นอกจากนี้ยังมีกรณีที่มีคนต้องการทำเช่น นี้2> bla.logซึ่งจะทำงานตราบเท่าที่คุณท่อและไม่ยากรหัส2 /dev/stderrโดยทั่วไป2ไม่จำเป็นต้องเป็นstderrผลลัพธ์
larkey

6

ในทุบตีและเปลือกหอยอื่น ๆ วิธีที่จะเปลี่ยนเส้นทางบางสิ่งบางอย่างที่จะ>&2ผิดพลาดมาตรฐานคือการใช้งาน ทุบตีเปิด/dev/stderrเป็นอธิบายไฟล์ 2ไฟล์ descriptor ถูกอ้างอิงโดย&Nที่Nคือหมายเลขของ descriptor ดังนั้นecho error >&2จะพิมพ์ข้อผิดพลาดมาตรฐานเพื่อerror/dev/stderr

นอกจากนี้ยังจะเปิดเป็นไฟล์อธิบาย/dev/stdout ซึ่งหมายความว่าคุณสามารถทำ1 echo output >&1อย่างไรก็ตามเนื่องจากทุกอย่างถูกพิมพ์ไปที่เอาต์พุตมาตรฐานอย่างไรก็ตามโดยค่าเริ่มต้นนั่นก็เหมือนกับecho outputของตัวเอง

ตอนนี้2>แตกต่าง ที่นี่คุณกำลังเปลี่ยนเส้นทางเอาต์พุตข้อผิดพลาดของคำสั่งที่อื่น ดังนั้น2>fileหมายถึง "เปลี่ยนเส้นทางสิ่งที่พิมพ์ไปยังไฟล์ descriptor 2 (ข้อผิดพลาดมาตรฐาน) ไปยังfile"


3

คุณพูดถูกต้อง>&2ตรงกว่าและ "สมบูรณ์" >/dev/stderrพวกเขาควรจะเทียบเท่าดังนั้นไม่มีเหตุผลโดยเฉพาะอย่างยิ่งกับการใช้งาน ยกเว้นว่าหากมีคนอ่านไม่ทราบว่าสิ่งเหล่านี้ทำสิ่งใดสิ่งหนึ่งอาจจะง่ายกว่า :-) อีกอันหนึ่ง >&2แต่โดยทั่วไปผมขอแนะนำให้คุณใช้

/ dev / stderr อาจมีประโยชน์เมื่อโปรแกรมจะเขียนข้อผิดพลาดไปยังชื่อไฟล์ที่ระบุ แต่ไม่รองรับ stderr เห็นได้ชัดว่านี่เป็นการประดิษฐ์เล็กน้อย / dev / stdout มีประโยชน์มากกว่านี้มาก (ฉันเพิ่งพบmysql_safeสคริปต์ตัวห่อหุ้มจะไม่เขียนข้อผิดพลาดไปยังคอนโซล แต่น่าเสียดายที่มันต้องการเปลี่ยนการอนุญาตในไฟล์บันทึกข้อผิดพลาดดังนั้นการใช้ / dev / stderr ทำให้เกิดคำเตือนบางอย่างที่ไม่จำเป็น)

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