ต้อนรับเข้าสู่อีกวันศุกร์ ...
ได้เวลาทำความรู้จักกับส่วนเล็ก ๆ ของอาคารผู้โดยสารแล้ว หลังจากคิดมากฉันตัดสินใจสร้างโพสต์เกี่ยวกับไฟล์ สตรีมมาตรฐาน; แม้ว่ามันจะดูผิวเผิน แต่ฉันคิดว่ามันเป็นสิ่งที่ทุกคนควรรู้
สตรีมมาตรฐาน
สตรีมมาตรฐาน ประกอบด้วยช่องทางการสื่อสารหลายช่องทางระหว่างผู้ใช้และเครื่องปลายทาง อินพุต / เอาท์พุต "ช่องสัญญาณ" เหล่านี้จะแสดงหรือจับข้อมูลเมื่อมีการเรียกใช้คำสั่ง
การเชื่อมต่อ 3 I / O ได้แก่ : สเตดิน อินพุตมาตรฐาน, แย่ เอาต์พุตมาตรฐาน, สตเดอร์ มาตรฐานบกพร่อง.
stdin: อินพุตมาตรฐาน
อินพุตมาตรฐานเป็นวิธีที่เรารวบรวมข้อมูลจากคำสั่งไม่ว่าจะผ่านไปป์การเปลี่ยนเส้นทางแป้นพิมพ์ ฯลฯ เราระบุด้วย file descriptor 0
ตัวอย่างของ stdin จะเป็น:
เรียงลำดับ <รายการ
ใช้ข้อมูลทั้งหมดที่อยู่ในรายการ - ในกรณีนี้คือตัวเลขที่เขียนแบบสุ่ม - และเมื่อเปลี่ยนเส้นทางไฟล์ไปยังคำสั่ง ls ไฟล์จะเรียงลำดับรายการตัวเลขตามตัวอักษร ในตัวอย่างนี้แฟล็กเป็นนัย
stdout: เอาต์พุตมาตรฐาน
เอาต์พุตมาตรฐานตามชื่อแสดงผลลัพธ์ของคำสั่งผ่านคอนโซล ถ้าเราเขียน ls ข้อมูลทั้งหมดที่แสดงบนหน้าจอคือเอาต์พุตมาตรฐาน แสดงโดย descriptor 1.
ตอนนี้ฉันจะพยายามสร้างอินสแตนซ์ stdin และ stdout ด้วยสคริปต์ที่เขียนด้วย bash เพียงเพราะฉันรัก bash ฮ่า ๆ ๆ ๆ 🙂
ทดสอบ.sh
#! / bin / bash ถ้า [-t 0]; จากนั้นก้อง "คุณกำลังใช้ stdout" elif [-t 1]; จากนั้นสะท้อน "คุณกำลังใช้ stdin" อื่น ๆ สะท้อน "ข้อผิดพลาดที่โหดร้าย"
ตอนนี้ภาพหน้าจอที่สาธิตวิธีการใช้สคริปต์ เมื่อเปลี่ยนเส้นทางหรือใช้ไปป์กับสคริปต์ให้ใช้ ทดสอบ -t เพื่อให้ทราบว่ามีการเรียกใช้สคริปต์ stdout เท่านั้นหรือไม่และถ้าไม่ใช่ก็เห็นได้ชัดว่าเป็น stdin
bash test.sh ls | bash test.sh bash test.sh </ etc / passwd
อย่าลืมปรับเปลี่ยนคำสั่งและฝึกฝนเพื่อให้คุณเรียนรู้
stderr: ข้อผิดพลาดมาตรฐาน
Standard Error คือวิธีที่โปรแกรมแสดงข้อผิดพลาดหรือการวินิจฉัย แสดงโดย descriptor 2
เพื่อให้เข้าใจแนวคิดนี่คือสถานการณ์: เมื่อเราต้องการบันทึกข้อผิดพลาดของคำสั่งสิ่งแรกที่เราคิดคือเปลี่ยนทิศทางผลลัพธ์เป็นข้อความธรรมดา
ls> info.txt
สิ่งนี้จะได้ผลข้อมูลคำสั่งจะถูกเก็บไว้ในไฟล์ข้อความธรรมดา แต่เมื่อบันทึกข้อผิดพลาดจะไม่จัดเก็บ แต่จะแสดงบนหน้าจอและไฟล์ข้อความธรรมดาว่างเปล่า
แต่ถ้าเราใช้ 2> เพื่อระบุให้บันทึก stderr ในไฟล์:
ls foo 2> info.txt
ตอนนี้จะบันทึกข้อมูลข้อผิดพลาดในไฟล์ข้อความ
มากที่สุด เปลือก อนุญาตให้เก็บ stderr และ stdout ไว้ในคำสั่งคำสั่งเดียวด้วย &> โดยที่ Foo เป็นไดเร็กทอรีที่ไม่มีอยู่จริง
ls ดาวน์โหลด Foo &> info.txt
ไฟล์นี้จะมีข้อมูลเกี่ยวกับข้อผิดพลาดเมื่อเรียกใช้ ls บน Foo และจะแสดงรายการไดเรกทอรีภายใต้การดาวน์โหลด
และในที่สุดสิ่งที่มีชื่อเสียง 2> & 1?
ง่ายเปลี่ยนเส้นทาง stderr ไปยัง stdout ตรงกลางของ> และ 1 หมายความว่าจะเปลี่ยนเส้นทางไปที่ stdout หากไม่มีก็จะเป็นเช่น ... "redirect the error to file 1"
และด้วยเหตุนี้จึงสามารถเปลี่ยนเส้นทาง:
- stdout ไปยังไฟล์
- stderr ไปยังไฟล์
- stdout เพื่อ stderr
- stderr ถึง stdout
- stderr และ stdout ไปยังไฟล์
- หมู่คนอื่น ๆ
สำหรับคนสมัยนี้ เราอ่านและขอบคุณที่แวะมา 😀
น่าสนใจ. ขอบคุณบทเรียนของคุณฉันชอบ Bash มากกว่านี้มาก
เรียนน่าสนใจอย่างไรก็ตามคุณมีข้อผิดพลาดในบรรทัดต่อไปนี้:
"และเมื่อเปลี่ยนเส้นทางไฟล์เป็นคำสั่ง ls" ควรเป็น "และเมื่อเปลี่ยนเส้นทางไฟล์ไปยังคำสั่ง sort"
คำอวยพร
มีข้อผิดพลาดที่จุดเริ่มต้นของข้อความเมื่อคุณระบุคำสั่ง "ls" ควรเป็น "sort":
"นำข้อมูลทั้งหมดที่อยู่ในรายการ - ในกรณีนี้คือตัวเลขที่เขียนแบบสุ่ม - และเปลี่ยนเส้นทางไฟล์ไปยังคำสั่ง ls (ในที่นี้จะเป็นการจัดเรียง)"
ทักทายและขอบคุณสำหรับการแบ่งปันงานของคุณ
สิ่งนี้ยอดเยี่ยมสำหรับ cron ที่คุณต้องการให้เอาต์พุตถูกล้าง (/ dev / null) แต่ข้อผิดพลาดจะถูกเก็บไว้ในไฟล์ นอกจากนี้เมื่อฉันทำเช่นนี้ฉันมักจะใช้คำสั่ง date เพื่อระบุว่าเมื่อใดที่ล้มเหลว
Bash (sh) มีเครื่องมือเหล่านี้ที่พัฒนาโดยปรัชญา Unix "ทำสิ่งเดียวและทำได้ดี"
ฉันไม่พบอะไรเลย
ฮ่าฮ่ามันอธิบายได้ค่อนข้างดีคุณไม่เข้าใจอะไร?