เชลล์ Linux/Bash มีสตรีมข้อมูลสามสตรีมที่คุณสามารถแตะเมื่อดำเนินการคำสั่ง – stdin , มาตรฐาน, และ stderr . วิธีใช้งานมีดังนี้
stdin , stdout , stderr อนุญาตให้แสดงข้อความในคอนโซล และข้อมูลที่ส่งออกแต่ละสตรีมสามารถนำไปยังโปรแกรมอื่นได้
สิ่งเหล่านี้เรียกว่า สตรีมมาตรฐาน .
stdinคืออะไร (อินพุตมาตรฐาน)?
สตรีมป้อนข้อความ
แอปพลิเคชันสามารถรับข้อความผ่าน stdin เป็นอินพุต
stdoutคืออะไร (เอาต์พุตมาตรฐาน)?
สตรีมเอาท์พุตข้อความของโปรแกรม
แอปพลิเคชันส่งข้อมูลไปยังโปรแกรมอื่น (หรือไปที่คอนโซลเพื่อดู) ผ่าน stdout .
stderr (ข้อผิดพลาดมาตรฐาน) คืออะไร
สตรีมเอาต์พุตข้อผิดพลาดข้อความของโปรแกรม
หากโปรแกรมพบข้อผิดพลาด ควรส่งข้อมูลเกี่ยวกับข้อผิดพลาดผ่าน stdout สตรีม
…ใช่ แต่นั่นมันหมายความว่ายังไงกันแน่?
โปรแกรมคอมพิวเตอร์ทำสิ่งต่างๆ ด้วยข้อมูลอินพุตและเอาต์พุต เช่น โปรแกรมอาจยอมรับสมการคณิตศาสตร์และหาคำตอบให้
คุณต้องการวิธีรับสมการ IN ของโปรแกรมและวิธีรับคำตอบ OUT ของโปรแกรม คุณยังต้องการทราบด้วยว่าสมการนั้นแก้ไม่ได้หรือไม่ ดังนั้นคุณจึงต้องการเห็นข้อผิดพลาดที่สร้างขึ้น แยกจาก OUTPUT อื่นๆ
นั่นคือ stdin , stdout และ stderr .
เนื่องจากการมีทุกอย่างทำงานในลักษณะเดียวกันทำให้ชีวิตง่ายขึ้น อินพุต เอาต์พุต และสตรีมข้อผิดพลาดเหล่านี้จึงกลายเป็นมาตรฐาน ดังนั้นแอปพลิเคชันที่สร้างขึ้นสำหรับบรรทัดคำสั่งทั้งหมดจะทำงานในลักษณะเดียวกัน
ดังนั้น สตรีมมาตรฐาน . แต่ละสตรีมมีตัวระบุตัวเลขตั้งแต่ 0-3:
0 | stdin |
1 | stdout |
2 | stderr |
เปลี่ยนเส้นทาง/วางท่อจาก stdin , stdout , stderr ใน Bash/Shell
คุณพิมพ์ลงในเปลือก Linux เป็นสตรีมของข้อความ คุณพิมพ์ และสตรีมข้อความจะป้อนลงในอินพุตคอนโซล
แอปพลิเคชันทำงาน และข้อมูลข้อความที่ส่งออกจะถูกป้อนลงในคอนโซลเพื่อแสดงเพื่อให้คุณสามารถอ่านได้
นี่เป็นพฤติกรรมเริ่มต้นทั้งหมดเมื่อทำงานบนคอนโซล แต่สามารถเปลี่ยนแปลงได้ สตรีมสามารถเปลี่ยนเส้นทางได้ ตัวอย่างเช่น เอาต์พุตของโปรแกรมสามารถสตรีมโดยตรงไปยังไฟล์แทนการดูคอนโซลได้
เอาต์พุตจากโปรแกรมหนึ่งสามารถเปลี่ยนเส้นทางไปยังอินพุตของโปรแกรมอื่นได้โดยตรง
ต่อไปนี้คือตัวอย่างพื้นฐานบางส่วนโดยใช้การเปลี่ยนเส้นทางและการวางท่อ
เปลี่ยนเส้นทาง
โดยปกติ ก้อง คำสั่งจะพิมพ์ข้อความไปที่คอนโซล:
echo "hello there!"
stdout ของโปรแกรม echo ใช้เส้นทางเริ่มต้นเพื่อแสดงบนหน้าจอของคุณ
การเปลี่ยนเส้นทาง ให้คุณส่งไปที่อื่น ที่นี่มันถูกส่งไปยังไฟล์:
echo "hello there!" > test.txt
ไฟล์ชื่อ text.txt จะถูกสร้างขึ้นโดยมีข้อความ “สวัสดี!” (ระวัง หากไฟล์นั้นมีอยู่แล้ว ไฟล์นั้นจะถูกเขียนทับ )
คุณสามารถเพิ่มไฟล์ต่อท้ายได้โดยใช้ >> แทน >
ต่อไป เรามาเปลี่ยนเส้นทาง stdin ใช้ <
cat < test.txt
แมว คำสั่งอ่านเนื้อหาของ text.txt ลงใน stdin สตรีมแล้วทำในสิ่งที่แมว คำสั่งออกแบบมาเพื่อทำ – พิมพ์ข้อมูลที่ส่งไปยัง stdout ซึ่งโดยค่าเริ่มต้นจะเป็นคอนโซลสำหรับการดู ดังนั้น นี่จะแสดงผล สวัสดี! ไปที่คอนโซล
ข้อมูลในไฟล์ถูกส่งไปยัง stdin สำหรับคำสั่ง cat – มันถูกเปลี่ยนเส้นทาง
นี่เป็นการโกงชนิดหนึ่ง แมว คำสั่งจะพยายามอ่านจากชื่อไฟล์ที่ส่งไปเป็นพารามิเตอร์โดยไม่มีการไพพ์ แต่เป็นคำสั่งที่ง่ายที่สุดสำหรับตัวอย่างนี้
คุณเปลี่ยนเส้นทาง stdin . ได้ และ stdout ในคำสั่งเดียวกัน:
cat < test.txt > output.txt
stdin กำลังถูกเปลี่ยนเส้นทาง กำลังอ่าน test.txt เข้าไปในแมว โปรแกรม และ stdout จาก แมว กำลังนำโปรแกรมไปที่ไฟล์ชื่อ output.txt .
ย้ำอีกทีว่านี่คือการโกงเพราะแค่ใช้ cat . จริงๆ คำสั่งให้คัดลอกไฟล์ แต่เป็นตัวอย่างง่ายๆ ที่ไม่อาศัยการอธิบายคำสั่งอื่น
สุดท้าย คุณสามารถเปลี่ยนเส้นทาง stderr สตรีมโดยระบุหมายเลขสตรีมเฉพาะที่เราต้องการอ่าน (เช่น stdout เป็นค่าเริ่มต้น ไม่จำเป็นต้องระบุ):
cat nofile.txt 2> error.txt
stdout ระบุด้วยหมายเลข 2 – หาก cat สร้างข้อผิดพลาดก็จะถูกส่งผ่านสตรีมนี้และไปยังไฟล์ error.txt .
ตัวอย่างข้างต้นจะสร้างไฟล์ชื่อ error.txt มีข้อความว่า:
cat: nofile.txt: No such file or directory
…ในฐานะ แมว ไม่พบไฟล์ nofile.txt .
การเปลี่ยนเส้นทางพร้อมกัน
ในตัวอย่างข้างต้น stderr สตรีมถูกระบุโดยตัวระบุที่เป็นตัวเลข ซึ่งหมายความว่าคุณสามารถเปลี่ยนเส้นทาง stdout และ stderr ในคำสั่งเดียวกันโดยระบุว่าคุณต้องการเปลี่ยนเส้นทางใด:
echo "hello there! 1>test.txt 2>error.txt
ด้านบน stdout ถูกส่งไปยัง test.txt และ stderr ถูกส่งไปยัง error.txt .
วางท่อ
การวางท่อเหมือนกับการเปลี่ยนเส้นทาง แต่เกี่ยวข้องกับ stdin . เท่านั้น และ stdout ข้อผิดพลาดจะถูกละเว้น
echo "hello there!" | cat
นี่ไปป์ (| ) ท่อ (เปลี่ยนเส้นทาง) stdout ของ เสียงสะท้อน คำสั่ง stdin ของ แมว คำสั่ง
บทสรุป
การทำงานกับแอปพลิเคชันบรรทัดคำสั่งอาจดูไม่เป็นธรรมชาติในตอนแรก แต่เป็นเครื่องมือที่มีประสิทธิภาพเมื่อทำงานอัตโนมัติ stdin , มาตรฐาน, และ stderr – สตรีมมาตรฐาน เป็นรากฐานที่สำคัญของความยืดหยุ่นนี้ - คุณสามารถเชื่อมโยงคำสั่งเข้าด้วยกันเพื่อสร้างเวิร์กโฟลว์ที่ซับซ้อนที่สามารถจัดการได้เกือบทุกงาน