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

สำหรับคนสมัยนี้ เราอ่านและขอบคุณที่แวะมา 😀


แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. ผู้รับผิดชอบข้อมูล: Miguel ÁngelGatón
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา

  1.   Eliotime3000 dijo

    น่าสนใจ. ขอบคุณบทเรียนของคุณฉันชอบ Bash มากกว่านี้มาก

  2.   Quincy magoo dijo

    เรียนน่าสนใจอย่างไรก็ตามคุณมีข้อผิดพลาดในบรรทัดต่อไปนี้:

    "และเมื่อเปลี่ยนเส้นทางไฟล์เป็นคำสั่ง ls" ควรเป็น "และเมื่อเปลี่ยนเส้นทางไฟล์ไปยังคำสั่ง sort"

    คำอวยพร

  3.   มิเกล dijo

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

    ทักทายและขอบคุณสำหรับการแบ่งปันงานของคุณ

  4.   โรเดอร์ dijo

    สิ่งนี้ยอดเยี่ยมสำหรับ cron ที่คุณต้องการให้เอาต์พุตถูกล้าง (/ dev / null) แต่ข้อผิดพลาดจะถูกเก็บไว้ในไฟล์ นอกจากนี้เมื่อฉันทำเช่นนี้ฉันมักจะใช้คำสั่ง date เพื่อระบุว่าเมื่อใดที่ล้มเหลว

    Bash (sh) มีเครื่องมือเหล่านี้ที่พัฒนาโดยปรัชญา Unix "ทำสิ่งเดียวและทำได้ดี"

  5.   โลโล dijo

    ฉันไม่พบอะไรเลย

    1.    เสียง dijo

      ฮ่าฮ่ามันอธิบายได้ค่อนข้างดีคุณไม่เข้าใจอะไร?