Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

เชี่ยวชาญ Input/Output Redirection ใน Linux Bash: คู่มือปฏิบัติจริง

Linux/Bash shell มีสาม data streams ที่คุณสามารถ tap into ได้เมื่อ execute คำสั่ง – stdin, stdout, และ stderr นี่คือวิธีใช้งาน

stdin, stdout, stderr อนุญาตให้แสดงข้อความใน console และข้อมูลที่ output แต่ละ stream สามารถนำไปยังโปรแกรมอื่นได้

เหล่านี้เรียกว่า Standard Streams

stdin (Standard Input) คืออะไร?

Text input stream

Applications สามารถรับข้อความผ่าน stdin เป็น input

stdout (Standard Output) คืออะไร?

Text output stream ของโปรแกรม

Applications ส่งข้อมูลไปโปรแกรมอื่น (หรือ console เพื่อดู) ผ่าน stdout

stderr (Standard Error) คืออะไร?

Text error output stream ของโปรแกรม

หากโปรแกรมพบ error มันควรส่งข้อมูลเกี่ยวกับ error ออกผ่าน stdout stream (หมายเหตุ: ต้นฉบับเขียน stdout แต่ควรเป็น stderr)

…แต่มันหมายความจริงอย่างไร?

โปรแกรมคอมพิวเตอร์ทำงานกับ input และ output data – เช่น โปรแกรมอาจรับสมการคณิตศาสตร์และให้คำตอบ

คุณต้องการวิธีได้สมการเข้าไปในโปรแกรม (stdin) และวิธีได้คำตอบออกมา (stdout) คุณยังต้องการรู้ว่าสมการแก้ไม่ได้ ดังนั้นต้องการเห็น ERRORs แยกจาก OUTPUT

นั่นคือ stdin, stdout, และ stderr

เพราะการทำงานแบบเดียวกันทำให้ชีวิตง่ายขึ้น streams เหล่านี้จึงถูก standardized ทำให้แอปพลิเคชันสำหรับ command line ทั้งหมดทำงานเหมือนกัน

ดังนั้น Standard Streams แต่ละ stream มี numerical identifier 0-3:

0stdin
1stdout
2stderr

Redirecting/Piping จาก stdin, stdout, stderr in Bash/Shell

คุณพิมพ์ใน Linux shell เป็น stream ของข้อความ – คุณพิมพ์ และ text stream ถูก feed เข้า console input

Application รัน และ text data output จากมันถูก feed เข้า console เพื่อแสดง เพื่อให้คุณอ่าน

นี่คือ default behavior เมื่อทำงานบน console แต่สามารถเปลี่ยนได้ Streams สามารถ redirect ได้ – เช่น output ของโปรแกรมสามารถ stream โดยตรงลงไฟล์แทน console

Output จากโปรแกรมหนึ่งสามารถ redirect เข้า input ของอีกโปรแกรมโดยตรงได้

นี่คือตัวอย่างพื้นฐานการใช้ redirection และ piping

Redirection

ปกติคำสั่ง echo จะพิมพ์ข้อความไป console:

echo "hello there!"

stdout ของ echo program ใช้ default path ไปแสดงบนหน้าจอ

Redirection ให้คุณส่งไปที่อื่น นี่ส่งไปไฟล์:

echo "hello there!" > test.txt

ไฟล์ชื่อ text.txt จะถูกสร้างมีข้อความ “hello there!” (ระวัง หากไฟล์มีอยู่แล้ว จะถูกเขียนทับ)

คุณสามารถ append ไฟล์ด้วย >> แทน >

ต่อไป ให้ redirect stdin ด้วย <

cat < test.txt

คำสั่ง cat อ่านเนื้อหา text.txt เข้า stdin stream แล้วทำสิ่งที่ cat ออกแบบมา – พิมพ์ข้อมูลที่ส่งมาไป stdout ซึ่ง default คือ console ดังนั้นจะ output hello there! ไป console

ข้อมูลในไฟล์ถูก direct ไป stdin สำหรับ cat command – มันถูก redirected

นี้คือการ cheat นิดหน่อย คำสั่ง cat จะพยายามอ่านจาก filename ที่ส่งเป็น parameter โดยไม่ต้อง piping แต่มันคือคำสั่งง่ายที่สุดสำหรับตัวอย่างนี้

คุณสามารถ redirect stdin และ stdout ในคำสั่งเดียวกันได้:

cat < test.txt > output.txt

stdin ถูก redirect อ่าน test.txt เข้า cat program และ stdout จาก cat ถูก direct ไปไฟล์ output.txt

อีกครั้งนี้คือ cheat เพราะมันแค่ใช้ cat copy ไฟล์ แต่เป็นตัวอย่างง่ายที่ไม่ต้องอธิบายคำสั่งอื่น

สุดท้าย คุณสามารถ redirect stderr stream โดยระบุ unique stream number ที่ต้องการอ่าน (เพราะ stdout เป็น default จึงไม่ต้องระบุ):

cat nofile.txt 2> error.txt

stdout ระบุด้วยหมายเลข 2 – หาก cat สร้าง error จะส่งผ่าน stream นี้เข้าไฟล์ error.txt

ตัวอย่างข้างต้นจะสร้างไฟล์ error.txt มีข้อความ:

cat: nofile.txt: No such file or directory

…เพราะคำสั่ง cat หาไฟล์ nofile.txt ไม่เจอ

Simultaneous Redirection

ในตัวอย่างข้างต้น stderr stream ระบุด้วย numeric identifier – หมายความว่าคุณสามารถ redirect stdout และ stderr ในคำสั่งเดียวกันได้ โดยระบุว่าต้องการ redirect ตัวไหน:

echo "hello there! 1>test.txt 2>error.txt

ข้างต้น stdout ส่งไป test.txt, และ stderr ส่งไป error.txt

Piping

Piping เหมือน redirection แต่จัดการแค่ stdin, และ stdout errors ถูก ignore

echo "hello there!" | cat

ที่นี่ pipe (|) pipes (redirects) stdout ของ echo command ไป stdin ของ cat command

สรุป

การทำงานกับ command-line applications อาจดู unintuitive ตอนแรก แต่มันเป็น powerful tools เมื่อ automate tasks stdin, stdout, และ stderr – standard streams เป็นหัวใจของความยืดหยุ่นนี้ – คุณสามารถ chain คำสั่งเข้าด้วยกันสร้าง workflows ซับซ้อนที่จัดการทุกงานเกือบหมด