ตามที่เราเข้าใจกันแล้วว่าคำสั่งต่างๆในลินุกซ์คือโปรแกรมที่ถูกเขียนขึ้นมาเพื่อเป็นเครื่องมือสำหรับผู้ใช้งาน ในเวลาที่โปรแกรมทำงานย่อมต้องการ 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 ของคำสั่งต่างๆซึ่งจะเป็นประโยชน์ต่อไปในการทำงานที่ซับซ้อนโดยใช้หลายๆคำสั่งมาประกอบกัน