Terminal Friday: สตรีมมาตรฐาน

ต้อนรับเข้าสู่อีกวันศุกร์ ...

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

สตรีมมาตรฐาน

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

แผนภาพด่วนบนสตรีมมาตรฐาน

แผนภาพด่วนบนสตรีมมาตรฐาน

การเชื่อมต่อ 3 I / O ได้แก่ : สเตดิน อินพุตมาตรฐาน, แย่ เอาต์พุตมาตรฐาน, สตเดอร์ มาตรฐานบกพร่อง.

stdin: อินพุตมาตรฐาน

อินพุตมาตรฐานเป็นวิธีที่เรารวบรวมข้อมูลจากคำสั่งไม่ว่าจะผ่านไปป์การเปลี่ยนเส้นทางแป้นพิมพ์ ฯลฯ เราระบุด้วย file descriptor 0

ตัวบอกเป็นตัวบ่งชี้ในการเข้าถึง - ในกรณีนี้ - ช่องสัญญาณอินพุตและเอาต์พุต ค่าเหล่านี้คือค่า int โดยปกติคือ 0, 1 และ 2

ตัวอย่างของ 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 ไปยังไฟล์
  • หมู่คนอื่น ๆ

นั่นคือทั้งหมดสำหรับผู้คนในวันนี้ เราอ่านกันและขอบคุณที่แวะมา


เพิ่มเป็นแหล่งข้อมูลที่ต้องการใน Google