มาดูวิธีการกัน stdin , stderr , และ stdout ใช้งานได้จริงและคุณจะใช้งานมันได้อย่างไร
stdin, stdout และ stderr
ในการคำนวณ คำว่า stream หมายถึงสิ่งที่สามารถถ่ายโอนข้อมูลได้ ในที่นี้ สตรีมทั้งสามมีข้อความเป็นข้อมูล
เช่นเดียวกับกระแสน้ำ สตรีมข้อมูลยังมีจุดปลายสองจุด มีที่มาและไหลออก คำสั่งใดก็ตามที่คุณใช้ในเทอร์มินัลจะอยู่ที่จุดใดจุดหนึ่งของสตรีม เมื่อใช้สตรีม คุณสามารถเชื่อมต่อสองหน้าต่างเทอร์มินัล สองคำสั่งที่แตกต่างกัน และแม้แต่ไฟล์!
มาดูรายละเอียดของสตรีมพิเศษกันอย่างรวดเร็ว
- stdin: แทนอินพุตมาตรฐาน ใช้ข้อความเป็นอินพุต
- stdout: ย่อมาจากเอาต์พุตมาตรฐาน เอาต์พุตข้อความของคำสั่งถูกเก็บไว้ในสตรีม stdout
- stderr: หมายถึงข้อผิดพลาดมาตรฐาน เมื่อใดก็ตามที่คำสั่งพบข้อผิดพลาด ข้อความแสดงข้อผิดพลาดจะถูกเก็บไว้ในสตรีมนี้
ใน Linux สตรีมเกือบทั้งหมดจะถือว่าเหมือนกับเป็นไฟล์ เช่นเดียวกับที่คุณสามารถอ่าน/เขียนไฟล์ได้ คุณสามารถอ่าน/เขียนข้อมูลจากสตรีมเหล่านี้ได้
วิธีง่ายๆ ในการเข้าถึงไฟล์ใดๆ คือการใช้หมายเลขตัวอธิบายไฟล์เฉพาะที่เชื่อมโยงกับไฟล์นั้น ในกรณีของสตรีมเหล่านี้ มีค่าที่ไม่ซ้ำกันกำหนดให้กับแต่ละค่า
- 0: stdin
- 1: stdout
- 2: stderr
stdin, stdout และ stderr ในการดำเนินการ
เริ่มต้นด้วยการเรียนรู้เพิ่มเติมเกี่ยวกับสตรีมเหล่านี้ผ่านการดำเนินการ เราจะเริ่มด้วย stdin
เรียกใช้คำสั่งต่อไปนี้
$อ่าน
คำสั่งจะต้องมีการป้อนข้อมูลจากแป้นพิมพ์ ที่นี่ เครื่องมืออ่านกำลังรับอินพุตจาก stdin ทีนี้มาดูที่ stdout
รันคำสั่งก่อน
$ลส -NS
ในที่นี้ คำสั่ง ls จะแสดงรายการไฟล์ในไดเร็กทอรีปัจจุบัน รายชื่อส่งไปที่ stdout และเทอร์มินัลจะพิมพ์ออกมา มาตรวจสอบ stderr กันเถอะ
ข้อผิดพลาดอาจเกิดขึ้นได้หลายวิธี สำหรับตัวอย่างนี้ การส่ง ls อาร์กิวเมนต์ที่ไม่ถูกต้องจะส่งผลให้เกิดข้อผิดพลาด
$ลส -NSอะไรก็ตาม
ที่นี่ไม่มีไฟล์ชื่ออะไร นั่นเป็นสาเหตุที่ข้อความ ls ส่งคืนถูกส่งไปยัง stderr .
ท่อ
นี่เป็นเทคนิคทั่วไปที่ใช้ประโยชน์จากสตรีม stdin และ stdout อย่างเต็มที่ มาอธิบายด้วยตัวอย่าง
$โยนออก 'สวัสดีชาวโลก' | กริปสวัสดี
ที่นี่ | ป้ายมีหน้าที่วางท่อ ผลลัพธ์ โยนออก สร้างถูกเขียนใน stdout ลำธาร. จากนั้นไพพ์จะเปลี่ยนเส้นทางเนื้อหาของ stdout ไปยัง stdin สำหรับคำสั่ง grep นั่นเป็นวิธีที่ grep รู้ว่าเนื้อหาใดที่จะดำเนินการ
หากคุณต้องการไพพ์ทั้ง stderr และ stdout ไปยังคำสั่งถัดไป ให้ใช้ |& แทน
$โยนออกสวัสดีชาวโลก| & แมว$อะไรก็ตาม| & แมว
กำลังเปลี่ยนเส้นทางสตรีม
ตอนนี้เรารู้แล้วว่าสตรีมเหล่านี้ทำงานอย่างไร มาดูกันว่าคุณสามารถเปลี่ยนเส้นทางได้อย่างไร การวางท่อเป็นรูปแบบหนึ่งของการเปลี่ยนเส้นทาง อย่างไรก็ตาม มันเกี่ยวข้องกับ stdin และ stdout เท่านั้น Bash อนุญาตให้ควบคุมทั้งสามสตรีมโดยเฉพาะ
หากต้องการเปลี่ยนเส้นทางเนื้อหา stdout ไปยังไฟล์ ให้เพิ่มมุม > ตามด้วยชื่อไฟล์เป้าหมาย
$โยนออกสวัสดีชาวโลก>สวัสดี.txt
ที่นี่ ผลลัพธ์ของคำสั่ง echo จะถูกเก็บไว้ในไฟล์ hello.txt
หากไฟล์นั้นมีอยู่แล้ว คำสั่งด้านบนจะเขียนทับไฟล์นั้น เพื่อหลีกเลี่ยง ตรวจสอบให้แน่ใจว่าชื่อไฟล์ไม่ซ้ำกัน หากคุณไม่ต้องการเขียนทับ คุณอาจต้องการใช้ >> แทน ผนวกเอาท์พุตต่อท้ายไฟล์เป้าหมาย
$โยนออก 'สวัสดีชาวโลก' >>สวัสดี.txt
เป้าหมายของ stdin คือการทำงานกับอินพุต นอกจากนี้ยังสามารถเปลี่ยนเส้นทางได้ ตัวอย่างเช่น แทนที่จะพิมพ์ข้อมูลจากแป้นพิมพ์ ก็สามารถโหลดจากไฟล์ได้
ในคำสั่งนี้ cat จะรับอินพุตโดยตรงจากไฟล์ hello.txt
$แมว <สวัสดี.txt
ลองดูการเปลี่ยนเส้นทางด้วยตัวอย่างอื่น คราวนี้จะเกี่ยวข้องกับสคริปต์ Python
$# pyin.py$ ชื่อ= ป้อนข้อมูล('ใส่ชื่อNS')
$อีเมล = ป้อนข้อมูล('กรอกอีเมลNS')
$พิมพ์('ชื่อของคุณคือ %s และอีเมลคือ %s'%(ชื่อ, อีเมล))
อินพุตสำหรับสคริปต์อยู่ที่ hello.txt
$แมวสวัสดี.txt
มาส่งไฟล์เป็นอินพุตสำหรับสคริปต์กันเถอะ
$ python3 pyin.พาย <สวัสดี.txt
ที่น่าสนใจคุณสามารถเปลี่ยนเส้นทางทั้งสอง stdin และ stdout ในบรรทัดคำสั่งเดียวกัน ที่นี่คำสั่งต่อไปนี้จะใช้ hello.txt as stdin และส่ง stdout ของคำสั่งไปยังไฟล์
$ python3 pyin.พาย <สวัสดี.txt >เอาท์พุทtxt
การเปลี่ยนเส้นทาง stderr คล้ายกับ stdout อย่างไรก็ตาม คุณต้องระบุรหัสคำอธิบาย 2 เพื่อระบุ stderr มิฉะนั้นก็จะใช้ stdout
ที่นี่ฉันจะเปลี่ยนเส้นทางเนื้อหาของ stderr ไปยังไฟล์ข้อความ
$อะไรก็ตาม2>error.txt
กำลังเปลี่ยนเส้นทาง Stdout และ Stderr
ใช่ สามารถเปลี่ยนเส้นทางทั้งสองพร้อมกันได้ สิ่งที่คุณต้องทำคือระบุรหัสคำอธิบาย 1 และ 2 ก่อนการเปลี่ยนเส้นทาง
$โยนออกสวัสดีชาวโลก1>output.log2>debug.log
ความคิดสุดท้าย
stdin , stdout , และ stderr เป็นข้อเสนอทุบตีคุณสมบัติที่ยอดเยี่ยมโดยค่าเริ่มต้น หากคุณชอบเขียนสคริปต์ทุบตี การใช้สคริปต์เหล่านี้อาจมีประโยชน์อย่างเหลือเชื่อในสถานการณ์ที่ยุ่งยาก
ต้องการเรียนรู้เพิ่มเติมเกี่ยวกับสคริปต์ทุบตีหรือไม่ มาเริ่มกันเลยดีกว่า คู่มือเริ่มต้นสำหรับการเขียนสคริปต์ทุบตี !
สนุก!