Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

เปลี่ยนเส้นทาง stdin, stdout, stderr ใน Linux/Bash พร้อมตัวอย่าง

เชลล์ Linux/Bash มีสตรีมข้อมูลสามสตรีมที่คุณสามารถแตะเมื่อดำเนินการคำสั่ง – stdinมาตรฐาน, และ stderr . วิธีใช้งานมีดังนี้

stdinstdoutstderr อนุญาตให้แสดงข้อความในคอนโซล และข้อมูลที่ส่งออกแต่ละสตรีมสามารถนำไปยังโปรแกรมอื่นได้

สิ่งเหล่านี้เรียกว่า สตรีมมาตรฐาน .

stdinคืออะไร (อินพุตมาตรฐาน)?

สตรีมป้อนข้อความ

แอปพลิเคชันสามารถรับข้อความผ่าน stdin เป็นอินพุต

stdoutคืออะไร (เอาต์พุตมาตรฐาน)?

สตรีมเอาท์พุตข้อความของโปรแกรม

แอปพลิเคชันส่งข้อมูลไปยังโปรแกรมอื่น (หรือไปที่คอนโซลเพื่อดู) ผ่าน stdout .

stderr (ข้อผิดพลาดมาตรฐาน) คืออะไร

สตรีมเอาต์พุตข้อผิดพลาดข้อความของโปรแกรม

หากโปรแกรมพบข้อผิดพลาด ควรส่งข้อมูลเกี่ยวกับข้อผิดพลาดผ่าน stdout สตรีม

…ใช่ แต่นั่นมันหมายความว่ายังไงกันแน่?

โปรแกรมคอมพิวเตอร์ทำสิ่งต่างๆ ด้วยข้อมูลอินพุตและเอาต์พุต เช่น โปรแกรมอาจยอมรับสมการคณิตศาสตร์และหาคำตอบให้

คุณต้องการวิธีรับสมการ IN ของโปรแกรมและวิธีรับคำตอบ OUT ของโปรแกรม คุณยังต้องการทราบด้วยว่าสมการนั้นแก้ไม่ได้หรือไม่ ดังนั้นคุณจึงต้องการเห็นข้อผิดพลาดที่สร้างขึ้น แยกจาก OUTPUT อื่นๆ

นั่นคือ stdinstdout และ stderr .

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

ดังนั้น สตรีมมาตรฐาน . แต่ละสตรีมมีตัวระบุตัวเลขตั้งแต่ 0-3:

0 stdin
1 stdout
2 stderr

เปลี่ยนเส้นทาง/วางท่อจาก stdinstdoutstderr ใน 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สตรีมมาตรฐาน เป็นรากฐานที่สำคัญของความยืดหยุ่นนี้ - คุณสามารถเชื่อมโยงคำสั่งเข้าด้วยกันเพื่อสร้างเวิร์กโฟลว์ที่ซับซ้อนที่สามารถจัดการได้เกือบทุกงาน