ตามที่เราเข้าใจกันแล้วว่าคำสั่งต่างๆในลินุกซ์คือโปรแกรมที่ถูกเขียนขึ้นมาเพื่อเป็นเครื่องมือสำหรับผู้ใช้งาน ในเวลาที่โปรแกรมทำงานย่อมต้องการ input คือข้อมูลที่ใช้เป็นตัวตั้งต้นในการทำงาน แสดง outputคือผลลัพธ์จากการทำงาน และแสดง error คือข้อผิดพลาดจากการทำงาน ระบบปฏิบัติการลินุกซ์จะจัดเตรียมส่วนเชื่อมต่อกับโปรแกรมคำสั่งเรียกว่า standard file descriptor หรือ standard file stream ประกอบด้วย
- standard input (standard in หรือ stdin) มีค่า file descriptor เป็น 0 และค่าตั้งต้นมักจะเป็น คีย์บอร์ด
- standard output (standard out หรือ stdout) มีค่า file descriptor เป็น 1 และค่าตั้งต้นมักจะเป็นหน้าจอคอนโซล
- standard error (หรือ stderr) มีค่า file descriptor เป็น 2 และค่าตั้งต้นมักจะเป็นหน้าจอเทอร์มินอลหรือไฟล์ log
เมื่อผู้พัฒนาโปรแกรมพัฒนาโปรแกรมคำสั่งขึ้นมาก็จะสั่งให้โปรแกรมอ่านข้อมูลจาก stdin และส่งผลลัพธ์และข้อผิดพลาดให้ stdout และ stderr ตามลำดับ โดยที่ไม่ต้องยุ่งยากในการเขียนโปรแกรมเพื่อติดต่อกับอุปกรณ์โดยตรง ตัวอย่างเช่น เราเรียกคำสั่ง ls เพื่อแสดงไฟล์และไดเร็คทอรี่ เราให้ input คือ ไดเร็คทอรี่ที่เราต้องการดูข้อมูลและได้ output คือผลลัพธ์บนหน้าจอหรือ error บนหน้าจอถ้าไดเร็คทอรี่นั้นไม่มีอยู่จริง
ภาพแสดงการใช้คำสั่ง ls
เราสามารถเปลี่ยนที่มาของ input และที่ไปของ output และ error ได้ เราเรียกว่าการทำ I/O Redirection โดยสามารถทำได้ดังนี้
- หากเราต้องการให้ stdin รับข้อมูลจากไฟล์ เราสามารถทำได้โดยใช้เครื่องหมาย < ดังนี้ คำสั่ง < ชื่อไฟล์
- เราสามารถส่งต่อผลลัพธ์จาก stdout ไปเป็น input ของคำสั่งถัดไปโดยใช้เครื่องหมาย | เป็นตัวเชื่อมระหว่างสองคำสั่งหรือมากกว่า ตัวอย่างเช่น คำสั่ง1 | คำสั่ง2 | คำสั่ง3
- หรือหากต้องการบันทึกผลลัพธ์ไปยังไฟล์เราสามารถทำได้โดยใช้เครื่องหมาย > ดังนี้ คำสั่ง > ชื่อไฟล์
- หากเราต้องการบันทึกข้อผิดพลาดไปยังไฟล์ที่เรากำหนด เราทำได้โดยการใช้ค่า file descriptor ดังนี้ คำสั่ง 2>ชื่อไฟล์ (ค่า file descriptor ของ stderr คือ 2)
- หรือถ้าเราต้องการบันทึกข้อผิดพลาดไปยังไฟล์เดียวกับผลลัพธ์สามารถทำได้โดย คำสั่ง > ชื่อไฟล์ 2>&1 หรือเขียนให้สั้นกว่านี้คือ คำสั่ง >& ชื่อไฟล์
ภาพแสดงการส่งผลลัพธ์จากคำสั่ง ls ไปยังไฟล์ data.txt
เราเรียนรู้เรื่องนี้กันเพื่อให้เกิดความเข้าใจในการเปลี่ยนทิศทางของ input ouput และ error ของคำสั่งต่างๆซึ่งจะเป็นประโยชน์ต่อไปในการทำงานที่ซับซ้อนโดยใช้หลายๆคำสั่งมาประกอบกัน