3. การเปลี่ยนทิศข้อมูล (Redirection)

 

ใช้สัญญลักษณ์ > ใสการเปลี่ยนทิศ

3.1 ข้อมูลมาตรฐาน

ข้อมูลมาตรฐานในเชลล์จะมีอยู่ 4 ชนิด คือข้อมูลเข้า(stdin), ข้อมูลแสดงผล(stdout), ข้อมูลข้อผิดพลาด(stderr), และแฟ้มข้อมูล(file)
ในทางปฏิบัติ เราสามารถเปลี่ยนทิศทางของข้อมูลเหล่านี้ไปมาได้ โดยมีมาตรฐานคือ 1 จะหมายถึงข้อมูลแสดงผล(stdout) และ 2 จะหมายถึงข้อมูลความผิดพลาด(stderr)

เช่น

3.2 ตัวอย่างเปลี่ยน stdout ไปเป็น file

$ ls -l > ls-l.txt

จะเปลี่ยนการแสดงผลของคำสั่ง ls -l ไปเก็บไว้ที่ไฟล์ชื่อ ls-l.txt ดังนั้นคำสั่งตามตัวอย่างนี้จะไม่แสดงอะไรออกมาทางจอภาพ แต่จะเก็บไว้ที่ไฟล์แทน หากเราต้องการดูผล สามารถใช้คำสั่งแสดงผลของไฟล์ได้คือ

$ cat ls-l.txt

3.3 ตัวอย่างเปลี่ยน stderr ไปเป็น file

$ grep da * 2> grep-errors.txt

ตัวอย่างนี้เป็นการค้นหาข้อความ da ในทุกไฟล์ (*) และหากเกิดข้อผิดพลาดขึ้น จะนำข้อความผิดพลาดไปเก็บไว้ที่ไฟล์ชื่อ grep-errors.txt

3.4 ตัวอย่างเปลี่ยน stdout ไปเป็น stderr

$ grep da * 1>&2

เป็นการค้นหาข้อความ da ในทุกไฟล์ (*) โดยนำการแสดงผลไปใส่ไว้ใน stderr แทนการแสดงผลปกติ แต่ในกรณีนี้เราป้อนคำสั่งทางแป้นพิมพ์ stdout และ stderr คือจอภาพเหมือนกัน จึงไม่เห็นความแตกต่าง แต่หากคำสั่งนี้ไปอยู่ในสคริปต์ที่เรากำหนดให้ stderr เป็นไฟล์ error-log การแสดงผลก็จะถูกเปลี่ยนทิศไปตามนั้น

3.5 ตัวอย่างเปลี่ยน stderr ไปเป็น stdout

$ grep da * 2>&1

เป็นการค้นหาข้อความ da ในทุกไฟล์ (*) โดยหากเกิดข้อผิดพลาดขึ้น จะแสดงผลข้อผิดพลาดออกมาทาง stdout ซึ่งในที่นี้คือจอภาพเหมือนกัน

3.6 ตัวอย่างเปลี่ยน stderr และ stdout ไปยัง file

$ rm -f $(find /home/USER -name core) &> /dev/null

คำสั่งนี้เป็นการค้นหาไฟล์ในไดเรคทอรี่ /home/USER ที่มีชื่อว่า core (find /home/USER -name core)
เมื่อพบแล้วก็จัดการลบทิ้งโดยไม่เตือน (rm -f)
โดยโยกการแสดงผลทั้งหมด (ทั้ง stderr และ stdout - ใช้สัญญลักษณ์ &>) ไปยังไฟล์ชื่อ /dev/null ซึ่งเป็นไฟล์พิเศษ หมายความว่ายกเลิกการแสดงผลทั้งหมด
(คำสั่งนี้ค่อนข้างอันตราย เพราะลบโดยไม่เตือน โปรดทดลองด้วยความระมัดระวังครับ)