การเปลี่ยนเส้นทางอินพุตเอาต์พุตในตัวอย่าง Linux/Unix

⚡ สรุปอย่างชาญฉลาด

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

  • 🔀 เปลี่ยนเส้นทาง: การเปลี่ยนเส้นทางการรับหรือส่งข้อมูล (Redirection) คือการเปลี่ยนวิธีการรับหรือส่งข้อมูลมาตรฐานของคำสั่งจากแป้นพิมพ์และหน้าจอไปยังไฟล์หรืออุปกรณ์อื่น
  • ➡️ Output: ตัวดำเนินการ > จะเขียนผลลัพธ์ลงในไฟล์ ในขณะที่ >> จะเพิ่มข้อมูลต่อท้ายไฟล์ที่มีอยู่โดยไม่ลบข้อมูลเดิม
  • ⬅️ Input: ตัวดำเนินการ < ใช้สำหรับป้อนไฟล์เข้าสู่คำสั่งเป็นอินพุตมาตรฐาน แทนที่จะใช้แป้นพิมพ์
  • 🔢 ตัวระบุไฟล์: ไฟล์ที่เปิดทุกไฟล์จะได้รับหมายเลข: 0 สำหรับ stdin, 1 สำหรับ stdout และ 2 สำหรับ stderr
  • ⚠️ การเปลี่ยนเส้นทางข้อผิดพลาด: การใช้ 2> จะส่งข้อความแสดงข้อผิดพลาดไปยังไฟล์แยกต่างหาก เพื่อไม่ให้ข้อความเหล่านั้นไปรบกวนผลลัพธ์ปกติ
  • 🔗 สตรีมรวม: ไวยากรณ์ 2>&1 จะกำหนดเส้นทางข้อผิดพลาดมาตรฐานไปยังเป้าหมายเดียวกันกับเอาต์พุตมาตรฐาน
  • 🤖 ความช่วยเหลือจาก AI: ผู้ช่วย AI และ GitHub Copilot สามารถสร้างและอธิบายคำสั่งการเปลี่ยนเส้นทางและสคริปต์เชลล์ได้

การเปลี่ยนเส้นทางการรับส่งข้อมูลใน Linux และ Unix พร้อมตัวอย่าง

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

การเปลี่ยนเส้นทางคืออะไร?

การเปลี่ยนเส้นทาง (Redirection) เป็นคุณสมบัติใน Linux ที่ช่วยให้คุณสามารถเปลี่ยนอุปกรณ์อินพุตและเอาต์พุตมาตรฐานได้เมื่อเรียกใช้คำสั่ง ขั้นตอนการทำงานพื้นฐานของระบบใดๆ ก็ตาม คำสั่งลินุกซ์ คือมันรับข้อมูลเข้าและให้ข้อมูลออก

  • อุปกรณ์อินพุตมาตรฐาน (stdin) คือแป้นพิมพ์
  • อุปกรณ์เอาต์พุตมาตรฐาน (stdout) คือหน้าจอ

ด้วยการเปลี่ยนเส้นทางการรับส่งข้อมูล มาตรฐานการรับและส่งข้อมูลข้างต้นสามารถเปลี่ยนแปลงได้

การเปลี่ยนเส้นทางเอาต์พุต

ภาพด้านล่างแสดงจุดเริ่มต้นของตัวอย่างการเปลี่ยนเส้นทางการส่งออกข้อมูล

ส่วนแสดงหัวเรื่องสำหรับการเปลี่ยนเส้นทางการส่งออก

สัญลักษณ์ '>' ใช้สำหรับเปลี่ยนเส้นทางการส่งออก (STDOUT)

ตัวอย่าง:

ls -al > listings

ในกรณีนี้ ผลลัพธ์ของคำสั่ง ls -al จะถูกส่งไปยังไฟล์ “listings” แทนที่จะแสดงบนหน้าจอของคุณ ภาพหน้าจอด้านล่างแสดงผลลัพธ์ดังกล่าว

เทอร์มินัลแสดงรายการ ls -al ที่ถูกเปลี่ยนเส้นทางไปยังไฟล์รายการ

หมายเหตุ: โปรดใช้ชื่อไฟล์ที่ถูกต้องเมื่อทำการเปลี่ยนเส้นทางการส่งออกคำสั่งไปยังไฟล์ หากมีไฟล์ชื่อเดียวกันอยู่แล้ว คำสั่งที่เปลี่ยนเส้นทางจะลบเนื้อหาของไฟล์นั้นแล้วเขียนทับไฟล์ใหม่

หากคุณไม่ต้องการให้ไฟล์ถูกเขียนทับ แต่ต้องการเพิ่มเนื้อหาลงในไฟล์ที่มีอยู่แล้ว ให้ใช้ตัวดำเนินการ '>>' ภาพหน้าจอด้านล่างแสดงเนื้อหาที่เพิ่มด้วย '>>'

หน้าต่างเทอร์มินัลแสดงผลลัพธ์คำสั่งที่ถูกเพิ่มต่อท้ายไฟล์ที่มีอยู่แล้วด้วยเครื่องหมายมากกว่าสองตัว

คุณสามารถเปลี่ยนเส้นทางการส่งออกมาตรฐานได้ไม่เพียงแค่ไปยังไฟล์เท่านั้น แต่ยังสามารถไปยังอุปกรณ์ต่างๆ ได้อีกด้วย

$ cat music.mp3 > /dev/audio

คำสั่ง `cat` อ่านไฟล์เพลงmp3 และส่งเอาต์พุตไปยัง /dev/audio ซึ่งเป็นอุปกรณ์เสียง หากการตั้งค่าเสียงบนพีซีของคุณถูกต้อง คำสั่งนี้จะเล่นไฟล์เพลงmp3.

การเปลี่ยนเส้นทางอินพุต

ภาพด้านล่างแสดงวิธีการเปลี่ยนเส้นทางการป้อนข้อมูล

ส่วนกราฟิกหัวเรื่องการเปลี่ยนเส้นทางการป้อนข้อมูล

สัญลักษณ์ '<' ใช้สำหรับการเปลี่ยนเส้นทางการรับข้อมูล (STDIN)

ตัวอย่าง: โปรแกรมอีเมลใน Linux สามารถช่วยคุณส่งอีเมลจากเทอร์มินัลได้

คุณสามารถพิมพ์เนื้อหาอีเมลโดยใช้แป้นพิมพ์ ซึ่งเป็นอุปกรณ์ป้อนข้อมูลมาตรฐานได้ แต่หากต้องการแนบไฟล์ไปกับอีเมล คุณสามารถใช้ตัวดำเนินการเปลี่ยนเส้นทางการป้อนข้อมูลในรูปแบบต่อไปนี้ได้

mail -s "Subject" to-address < Filename

ภาพหน้าจอด้านล่างแสดงคำสั่ง mail ที่อ่านไฟล์เป็นข้อมูลป้อนเข้า

คำสั่ง mail โดยใช้การเปลี่ยนเส้นทางการป้อนข้อมูลเพื่อแนบไฟล์ไปกับอีเมล

วิธีนี้จะแนบไฟล์ไปกับอีเมล และส่งไปยังผู้รับ

ตัวอย่างข้างต้นเป็นตัวอย่างง่ายๆ ทีนี้มาดูเทคนิคการเปลี่ยนเส้นทางขั้นสูงที่ใช้ตัวระบุไฟล์กันบ้าง

เนื้อไม่มีมัน Descriptหรือ (FD)

ในระบบ Linux และ Unix ทุกอย่างล้วนเป็นไฟล์ ไม่ว่าจะเป็นไฟล์ทั่วไป โฟลเดอร์ หรือแม้แต่อุปกรณ์ต่างๆ ไฟล์ทุกไฟล์จะมีหมายเลขกำกับที่เรียกว่าตัวระบุไฟล์ (File Descriptor หรือ FD)

แผนภาพด้านล่างแสดงสตรีมมาตรฐานและตัวระบุไฟล์ของสตรีมเหล่านั้น

แผนภาพแสดงสตรีมอินพุต เอาต์พุต และข้อผิดพลาดมาตรฐาน รวมถึงตัวระบุไฟล์ของแต่ละสตรีม

หน้าจอของคุณก็มีตัวระบุไฟล์เช่นกัน เมื่อโปรแกรมทำงาน ผลลัพธ์จะถูกส่งไปยังตัวระบุไฟล์ของหน้าจอ และคุณจะเห็นผลลัพธ์ของโปรแกรมบนจอภาพของคุณ หากผลลัพธ์ถูกส่งไปยังตัวระบุไฟล์ของเครื่องพิมพ์ ผลลัพธ์ของโปรแกรมก็จะถูกพิมพ์ออกมา

ข้อผิดพลาดในการเปลี่ยนเส้นทาง

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

ไฟล์เหล่านี้จะมีอยู่เสมอเมื่อโปรแกรมทำงาน ดังที่ได้อธิบายไว้ก่อนหน้านี้ ตัวระบุไฟล์ (file descriptor) จะเชื่อมโยงกับไฟล์แต่ละไฟล์เหล่านี้

เนื้อไม่มีมัน เนื้อไม่มีมัน Descriptor
อินพุตมาตรฐาน STDIN 0
เอาต์พุตมาตรฐาน STDOUT 1
ข้อผิดพลาดมาตรฐาน STDERR 2

โดยค่าเริ่มต้น ข้อความแสดงข้อผิดพลาดจะปรากฏบนหน้าจอ การเปลี่ยนเส้นทางข้อผิดพลาดจะส่งข้อผิดพลาดไปยังไฟล์อื่นที่ไม่ใช่หน้าจอ

เหตุใดจึงมีข้อผิดพลาดในการเปลี่ยนเส้นทาง

การเปลี่ยนเส้นทางข้อผิดพลาดเป็นหนึ่งในคุณสมบัติยอดนิยมของ Unix และ Linux

ผู้ใช้ Unix เป็นประจำจะทราบดีว่าคำสั่งหลายคำสั่งมักก่อให้เกิดข้อผิดพลาดจำนวนมาก ตัวอย่างเช่น ขณะค้นหาไฟล์ มักจะได้รับข้อผิดพลาดมากมาย การอนุญาต ข้อผิดพลาดที่ถูกปฏิเสธ มักไม่เป็นประโยชน์ต่อผู้ที่กำลังค้นหาไฟล์นั้นๆ ขณะที่กำลังรันสคริปต์เชลล์ คุณมักไม่ต้องการให้ข้อความแสดงข้อผิดพลาดมาเกะกะเอาต์พุตปกติของโปรแกรม

วิธีแก้ปัญหาคือการส่งข้อความแสดงข้อผิดพลาดไปยังไฟล์

1 ตัวอย่าง

$ myprogram 2>errorsfile

ภาพหน้าจอข้างล่างแสดงคำสั่งนี้ในเทอร์มินัล

เทอร์มินัลกำลังรันโปรแกรมของฉัน โดยมีการส่งต่อข้อผิดพลาดมาตรฐานไปยังไฟล์ errorsfile

ด้านบน เรากำลังเรียกใช้โปรแกรมชื่อ myprogram ตัวระบุไฟล์สำหรับข้อผิดพลาดมาตรฐานคือ 2 การใช้ “2>” จะเปลี่ยนเส้นทางการส่งออกข้อผิดพลาดไปยังไฟล์ชื่อ “errorsfile” ดังนั้น ผลลัพธ์ของโปรแกรมจึงไม่รกไปด้วยข้อผิดพลาด

2 ตัวอย่าง

นี่คืออีกตัวอย่างหนึ่งที่ใช้คำสั่ง find

find . -name 'my*' 2>error.log

เราใช้คำสั่ง find เพื่อค้นหาไฟล์ในไดเร็กทอรีปัจจุบัน "." ที่มีชื่อขึ้นต้นด้วย "my" และส่งข้อผิดพลาดใดๆ ไปยัง error.log

3 ตัวอย่าง: ลองมาดูตัวอย่างที่ซับซ้อนกว่านี้กันครับ

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

ls Documents ABC> dirlist 2>&1

แผนภาพด้านล่างแสดงให้เห็นว่าสตรีมทั้งสองถูกบันทึกไว้ในไฟล์เดียว

แผนภาพแสดงเอาต์พุตมาตรฐานและข้อผิดพลาดมาตรฐานที่ถูกส่งไปยังไฟล์ dirlist ทั้งคู่

ที่นี่:

  • 2>&1 หมายความว่า STDERR จะถูกส่งต่อไปยังเป้าหมายเดียวกับ STDOUT (ซึ่งก็คือไฟล์ dirlist)
  • ข้อความแสดงข้อผิดพลาดจะถูกส่งไปยังเอาต์พุตมาตรฐาน ซึ่งจะถูกส่งต่อไปยังไฟล์ dirlist อีกที ดังนั้น ข้อมูลทั้งสองส่วนจึงถูกเขียนลงในไฟล์ dirlist เหมือนกัน

แผนภาพด้านล่างสรุปวิธีการทำงานร่วมกันของข้อมูลขาเข้า ข้อมูลขาออก และการเปลี่ยนเส้นทางข้อผิดพลาด

แผนภาพสรุปการรับข้อมูล การส่งออกข้อมูล และการเปลี่ยนเส้นทางข้อผิดพลาดใน Linux และ Unix

คำถามที่พบบ่อย

A ท่อ (|) ส่งเอาต์พุตของคำสั่งหนึ่งไปยังอีกคำสั่งหนึ่งโดยตรงเป็นอินพุต การเปลี่ยนเส้นทางจะเชื่อมต่อคำสั่งกับไฟล์หรืออุปกรณ์ โดยเขียนเอาต์พุตลงไปหรืออ่านอินพุตจากอุปกรณ์นั้น ท่อ (pipes) เชื่อมคำสั่งเข้าด้วยกัน การเปลี่ยนเส้นทางจะเชื่อมคำสั่งกับไฟล์

ตัวดำเนินการ > จะเขียนผลลัพธ์ของคำสั่งลงในไฟล์ โดยแทนที่เนื้อหาที่มีอยู่เดิม ส่วนตัวดำเนินการ >> จะเพิ่มผลลัพธ์ต่อท้ายไฟล์แทนping สิ่งที่มีอยู่แล้ว ใช้ >> ทุกครั้งที่คุณต้องการเพิ่มข้อมูลลงในไฟล์ แทนที่จะเขียนทับข้อมูลเดิม

/dev/null เป็นไฟล์พิเศษที่ลบทุกอย่างที่เขียนลงไป การเพิ่ม 2>/dev/null ต่อท้ายคำสั่งจะเปลี่ยนเส้นทางการแสดงข้อความแสดงข้อผิดพลาดไปยังไฟล์นั้น โดยจะลบข้อความเหล่านั้นทิ้งไปอย่างเงียบๆ เพื่อให้เหลือเพียงผลลัพธ์ปกติบนหน้าจอ วิธีนี้เป็นวิธีที่ใช้กันทั่วไปในการซ่อนข้อความแสดงข้อผิดพลาดที่ไม่ต้องการ

คำสั่ง tee อ่านข้อมูลจากอินพุตมาตรฐานและเขียนข้อมูลไปยังทั้งหน้าจอและไฟล์หนึ่งไฟล์หรือมากกว่านั้นพร้อมกัน ตัวอย่างเช่น ls -al | tee listing.txt คำสั่งนี้ช่วยให้คุณบันทึกผลลัพธ์ของคำสั่งลงในไฟล์ได้ในขณะที่ยังคงดูผลลัพธ์นั้นบนหน้าจออยู่

เอกสาร here ใช้ตัวดำเนินการ << เพื่อป้อนข้อความหลายบรรทัดเข้าไปในคำสั่งเป็นอินพุต โดยสิ้นสุดที่คำเครื่องหมายที่คุณเลือก มีประโยชน์ในสคริปต์เชลล์สำหรับการส่งข้อมูลหลายบรรทัด เช่น เนื้อหาอีเมล โดยไม่ต้องใช้ไฟล์แยกต่างหาก

ใช้ไวยากรณ์ 2>&1 หลังจากเปลี่ยนเส้นทางการส่งออก เช่น command > file 2>&1 เพื่อให้ข้อผิดพลาดมาตรฐานตามเอาต์พุตมาตรฐานไปยังไฟล์ ใน Bash รุ่นใหม่ คำสั่งย่อ &> file ก็ทำเช่นเดียวกัน ลำดับมีความสำคัญ: วาง 2>&1 ไว้หลังจากเปลี่ยนเส้นทางการส่งออก

ผู้ช่วย AI สามารถแปลงคำขอภาษาอังกฤษธรรมดาให้เป็นคำสั่งการเปลี่ยนเส้นทางที่ถูกต้อง อธิบายว่าตัวดำเนินการต่างๆ เช่น 2>&1 หรือ &> ทำอะไร และแจ้งเตือนข้อผิดพลาดก่อนที่คุณจะเรียกใช้ นอกจากนี้ เครื่องมือการเรียนรู้ของเครื่องยังสแกนไฟล์บันทึกและข้อผิดพลาดที่ถูกเปลี่ยนเส้นทางเพื่อค้นหาความผิดปกติที่การตรวจสอบด้วยตนเองอาจมองข้ามไป

ใช่. นักบิน GitHub สามารถสร้างคำสั่งและสคริปต์ที่เปลี่ยนเส้นทางการป้อนข้อมูล การส่งออกข้อมูล และข้อผิดพลาดจากข้อความอธิบายเป้าหมายสั้นๆ และดำเนินการให้เสร็จสมบูรณ์ขณะที่คุณพิมพ์ Revตรวจสอบคำสั่งที่แนะนำใดๆ ที่ใช้เขียนทับข้อมูลไฟล์ของคุณ โดยเฉพาะคำสั่งที่ใช้เครื่องหมาย > ซึ่งจะเขียนทับข้อมูลที่มีอยู่เดิม

สรุปโพสต์นี้ด้วย: