stdin, stderr และ stdout ใน Bash . คืออะไร

What Are Stdin Stderr



เมื่อใดก็ตามที่รันคำสั่งใด ๆ ในเทอร์มินัล stdin , stderr , และ stdout คือสามสตรีมข้อมูลที่ทุบตีสร้าง หากคุณคุ้นเคยกับบรรทัดคำสั่ง คุณอาจใช้ประโยชน์จากคุณลักษณะเหล่านี้ไปแล้ว โดยพื้นฐานแล้วจะอนุญาตให้ไพพ์/เปลี่ยนเส้นทางข้อมูลจากคำสั่งหนึ่งไปยังอีกคำสั่งหนึ่ง

มาดูวิธีการกัน 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 เป็นข้อเสนอทุบตีคุณสมบัติที่ยอดเยี่ยมโดยค่าเริ่มต้น หากคุณชอบเขียนสคริปต์ทุบตี การใช้สคริปต์เหล่านี้อาจมีประโยชน์อย่างเหลือเชื่อในสถานการณ์ที่ยุ่งยาก

ต้องการเรียนรู้เพิ่มเติมเกี่ยวกับสคริปต์ทุบตีหรือไม่ มาเริ่มกันเลยดีกว่า คู่มือเริ่มต้นสำหรับการเขียนสคริปต์ทุบตี !

สนุก!