การเปลี่ยนเส้นทางอินพุตเอาต์พุตในตัวอย่าง Linux/Unix
⚡ สรุปอย่างชาญฉลาด
การเปลี่ยนเส้นทางใน Linux และ Unix จะเปลี่ยนตำแหน่งที่คำสั่งอ่านข้อมูลเข้าหรือส่งข้อมูลออกping แป้นพิมพ์และหน้าจอสำหรับไฟล์หรืออุปกรณ์ที่ใช้ตัวดำเนินการ เช่น เครื่องหมายมากกว่า เครื่องหมายน้อยกว่า และตัวดำเนินการต่อท้าย

การเปลี่ยนเส้นทางเป็นหนึ่งในคุณสมบัติที่มีประโยชน์ที่สุดของ ลินุกซ์ และเชลล์ Unix เนื่องจากช่วยให้คุณกำหนดได้ว่าคำสั่งจะอ่านข้อมูลเข้าและส่งข้อมูลออกไปยังที่ใด หน้านี้อธิบายเกี่ยวกับการเปลี่ยนเส้นทางการส่งออก ข้อมูลเข้า และข้อผิดพลาด พร้อมตัวอย่างประกอบ
การเปลี่ยนเส้นทางคืออะไร?
การเปลี่ยนเส้นทาง (Redirection) เป็นคุณสมบัติใน Linux ที่ช่วยให้คุณสามารถเปลี่ยนอุปกรณ์อินพุตและเอาต์พุตมาตรฐานได้เมื่อเรียกใช้คำสั่ง ขั้นตอนการทำงานพื้นฐานของระบบใดๆ ก็ตาม คำสั่งลินุกซ์ คือมันรับข้อมูลเข้าและให้ข้อมูลออก
- อุปกรณ์อินพุตมาตรฐาน (stdin) คือแป้นพิมพ์
- อุปกรณ์เอาต์พุตมาตรฐาน (stdout) คือหน้าจอ
ด้วยการเปลี่ยนเส้นทางการรับส่งข้อมูล มาตรฐานการรับและส่งข้อมูลข้างต้นสามารถเปลี่ยนแปลงได้
การเปลี่ยนเส้นทางเอาต์พุต
ภาพด้านล่างแสดงจุดเริ่มต้นของตัวอย่างการเปลี่ยนเส้นทางการส่งออกข้อมูล
สัญลักษณ์ '>' ใช้สำหรับเปลี่ยนเส้นทางการส่งออก (STDOUT)
ตัวอย่าง:
ls -al > listings
ในกรณีนี้ ผลลัพธ์ของคำสั่ง ls -al จะถูกส่งไปยังไฟล์ “listings” แทนที่จะแสดงบนหน้าจอของคุณ ภาพหน้าจอด้านล่างแสดงผลลัพธ์ดังกล่าว
หมายเหตุ: โปรดใช้ชื่อไฟล์ที่ถูกต้องเมื่อทำการเปลี่ยนเส้นทางการส่งออกคำสั่งไปยังไฟล์ หากมีไฟล์ชื่อเดียวกันอยู่แล้ว คำสั่งที่เปลี่ยนเส้นทางจะลบเนื้อหาของไฟล์นั้นแล้วเขียนทับไฟล์ใหม่
หากคุณไม่ต้องการให้ไฟล์ถูกเขียนทับ แต่ต้องการเพิ่มเนื้อหาลงในไฟล์ที่มีอยู่แล้ว ให้ใช้ตัวดำเนินการ '>>' ภาพหน้าจอด้านล่างแสดงเนื้อหาที่เพิ่มด้วย '>>'
คุณสามารถเปลี่ยนเส้นทางการส่งออกมาตรฐานได้ไม่เพียงแค่ไปยังไฟล์เท่านั้น แต่ยังสามารถไปยังอุปกรณ์ต่างๆ ได้อีกด้วย
$ cat music.mp3 > /dev/audio
คำสั่ง `cat` อ่านไฟล์เพลงmp3 และส่งเอาต์พุตไปยัง /dev/audio ซึ่งเป็นอุปกรณ์เสียง หากการตั้งค่าเสียงบนพีซีของคุณถูกต้อง คำสั่งนี้จะเล่นไฟล์เพลงmp3.
การเปลี่ยนเส้นทางอินพุต
ภาพด้านล่างแสดงวิธีการเปลี่ยนเส้นทางการป้อนข้อมูล
สัญลักษณ์ '<' ใช้สำหรับการเปลี่ยนเส้นทางการรับข้อมูล (STDIN)
ตัวอย่าง: โปรแกรมอีเมลใน Linux สามารถช่วยคุณส่งอีเมลจากเทอร์มินัลได้
คุณสามารถพิมพ์เนื้อหาอีเมลโดยใช้แป้นพิมพ์ ซึ่งเป็นอุปกรณ์ป้อนข้อมูลมาตรฐานได้ แต่หากต้องการแนบไฟล์ไปกับอีเมล คุณสามารถใช้ตัวดำเนินการเปลี่ยนเส้นทางการป้อนข้อมูลในรูปแบบต่อไปนี้ได้
mail -s "Subject" to-address < Filename
ภาพหน้าจอด้านล่างแสดงคำสั่ง mail ที่อ่านไฟล์เป็นข้อมูลป้อนเข้า
วิธีนี้จะแนบไฟล์ไปกับอีเมล และส่งไปยังผู้รับ
ตัวอย่างข้างต้นเป็นตัวอย่างง่ายๆ ทีนี้มาดูเทคนิคการเปลี่ยนเส้นทางขั้นสูงที่ใช้ตัวระบุไฟล์กันบ้าง
เนื้อไม่มีมัน Descriptหรือ (FD)
ในระบบ Linux และ Unix ทุกอย่างล้วนเป็นไฟล์ ไม่ว่าจะเป็นไฟล์ทั่วไป โฟลเดอร์ หรือแม้แต่อุปกรณ์ต่างๆ ไฟล์ทุกไฟล์จะมีหมายเลขกำกับที่เรียกว่าตัวระบุไฟล์ (File Descriptor หรือ FD)
แผนภาพด้านล่างแสดงสตรีมมาตรฐานและตัวระบุไฟล์ของสตรีมเหล่านั้น
หน้าจอของคุณก็มีตัวระบุไฟล์เช่นกัน เมื่อโปรแกรมทำงาน ผลลัพธ์จะถูกส่งไปยังตัวระบุไฟล์ของหน้าจอ และคุณจะเห็นผลลัพธ์ของโปรแกรมบนจอภาพของคุณ หากผลลัพธ์ถูกส่งไปยังตัวระบุไฟล์ของเครื่องพิมพ์ ผลลัพธ์ของโปรแกรมก็จะถูกพิมพ์ออกมา
ข้อผิดพลาดในการเปลี่ยนเส้นทาง
ทุกครั้งที่คุณเรียกใช้โปรแกรมหรือคำสั่งที่เทอร์มินัล จะมีการเปิดไฟล์สามไฟล์อยู่เสมอ ได้แก่ ไฟล์รับข้อมูลมาตรฐาน ไฟล์แสดงผลมาตรฐาน และไฟล์แสดงข้อผิดพลาดมาตรฐาน
ไฟล์เหล่านี้จะมีอยู่เสมอเมื่อโปรแกรมทำงาน ดังที่ได้อธิบายไว้ก่อนหน้านี้ ตัวระบุไฟล์ (file descriptor) จะเชื่อมโยงกับไฟล์แต่ละไฟล์เหล่านี้
| เนื้อไม่มีมัน | เนื้อไม่มีมัน Descriptor |
|---|---|
| อินพุตมาตรฐาน STDIN | 0 |
| เอาต์พุตมาตรฐาน STDOUT | 1 |
| ข้อผิดพลาดมาตรฐาน STDERR | 2 |
โดยค่าเริ่มต้น ข้อความแสดงข้อผิดพลาดจะปรากฏบนหน้าจอ การเปลี่ยนเส้นทางข้อผิดพลาดจะส่งข้อผิดพลาดไปยังไฟล์อื่นที่ไม่ใช่หน้าจอ
เหตุใดจึงมีข้อผิดพลาดในการเปลี่ยนเส้นทาง
การเปลี่ยนเส้นทางข้อผิดพลาดเป็นหนึ่งในคุณสมบัติยอดนิยมของ Unix และ Linux
ผู้ใช้ Unix เป็นประจำจะทราบดีว่าคำสั่งหลายคำสั่งมักก่อให้เกิดข้อผิดพลาดจำนวนมาก ตัวอย่างเช่น ขณะค้นหาไฟล์ มักจะได้รับข้อผิดพลาดมากมาย การอนุญาต ข้อผิดพลาดที่ถูกปฏิเสธ มักไม่เป็นประโยชน์ต่อผู้ที่กำลังค้นหาไฟล์นั้นๆ ขณะที่กำลังรันสคริปต์เชลล์ คุณมักไม่ต้องการให้ข้อความแสดงข้อผิดพลาดมาเกะกะเอาต์พุตปกติของโปรแกรม
วิธีแก้ปัญหาคือการส่งข้อความแสดงข้อผิดพลาดไปยังไฟล์
1 ตัวอย่าง
$ myprogram 2>errorsfile
ภาพหน้าจอข้างล่างแสดงคำสั่งนี้ในเทอร์มินัล
ด้านบน เรากำลังเรียกใช้โปรแกรมชื่อ myprogram ตัวระบุไฟล์สำหรับข้อผิดพลาดมาตรฐานคือ 2 การใช้ “2>” จะเปลี่ยนเส้นทางการส่งออกข้อผิดพลาดไปยังไฟล์ชื่อ “errorsfile” ดังนั้น ผลลัพธ์ของโปรแกรมจึงไม่รกไปด้วยข้อผิดพลาด
2 ตัวอย่าง
นี่คืออีกตัวอย่างหนึ่งที่ใช้คำสั่ง find
find . -name 'my*' 2>error.log
เราใช้คำสั่ง find เพื่อค้นหาไฟล์ในไดเร็กทอรีปัจจุบัน "." ที่มีชื่อขึ้นต้นด้วย "my" และส่งข้อผิดพลาดใดๆ ไปยัง error.log
3 ตัวอย่าง: ลองมาดูตัวอย่างที่ซับซ้อนกว่านี้กันครับ
ผู้ดูแลระบบเซิร์ฟเวอร์มักจะแสดงรายการไดเร็กทอรีและจัดเก็บทั้งข้อผิดพลาดและเอาต์พุตมาตรฐานไว้ในไฟล์ ซึ่งสามารถประมวลผลได้ในภายหลัง นี่คือคำสั่งดังกล่าว
ls Documents ABC> dirlist 2>&1
แผนภาพด้านล่างแสดงให้เห็นว่าสตรีมทั้งสองถูกบันทึกไว้ในไฟล์เดียว
ที่นี่:
- 2>&1 หมายความว่า STDERR จะถูกส่งต่อไปยังเป้าหมายเดียวกับ STDOUT (ซึ่งก็คือไฟล์ dirlist)
- ข้อความแสดงข้อผิดพลาดจะถูกส่งไปยังเอาต์พุตมาตรฐาน ซึ่งจะถูกส่งต่อไปยังไฟล์ dirlist อีกที ดังนั้น ข้อมูลทั้งสองส่วนจึงถูกเขียนลงในไฟล์ dirlist เหมือนกัน
แผนภาพด้านล่างสรุปวิธีการทำงานร่วมกันของข้อมูลขาเข้า ข้อมูลขาออก และการเปลี่ยนเส้นทางข้อผิดพลาด






.png)