เปลี่ยนเส้นทาง stdout และ stderr ไปยัง File

Redirect Stdout Stderr File



เมื่อคุณเปลี่ยนเส้นทางเอาต์พุตคำสั่งไปยังไฟล์ คุณจะสังเกตเห็นว่าข้อความแสดงข้อผิดพลาดถูกพิมพ์บนหน้าต่างเทอร์มินัล คำสั่งใดๆ ที่ดำเนินการในเชลล์ Linux เช่น bash ใช้สตรีม I/O ปกติสามสตรีม ตัวอธิบายไฟล์ที่เป็นตัวเลขใช้เพื่อแสดงถึงแต่ละสตรีม

  • สตรีมอินพุตมาตรฐาน (stdin): 0
  • กระแสไฟขาออกมาตรฐาน (stdout): 1
  • กระแสข้อผิดพลาดมาตรฐาน (stderr): 2

ในโพสต์นี้ เราจะเข้าใจข้อมูลที่อยู่ภายใต้การเปลี่ยนเส้นทาง stdout และ stderr ไปยังไฟล์







เอาต์พุตมาตรฐาน (stdout):

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



ข้อผิดพลาดมาตรฐาน (stderr):

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



การเปลี่ยนเส้นทาง stdout และ stderr ไปยังไฟล์:

เนื่องจากการเปลี่ยนเส้นทางเป็นวิธีการจับภาพเอาต์พุตของโปรแกรมและส่งเป็นอินพุตไปยังคำสั่งหรือไฟล์อื่น สตรีม I/O สามารถเปลี่ยนเส้นทางได้โดยการใช้ตัวดำเนินการ n> โดยที่ n คือหมายเลขตัวอธิบายไฟล์ สำหรับการเปลี่ยนเส้นทาง stdout เราใช้ 1> และสำหรับ stderr จะมีการเพิ่ม 2> เป็นโอเปอเรเตอร์





เราได้สร้างไฟล์ชื่อ sample.txt เพื่อจัดเก็บเอาต์พุตที่เปลี่ยนเส้นทางในไดเร็กทอรีปัจจุบันของเรา



(คำสั่ง > ไฟล์) ถือเป็นตัวดำเนินการเปลี่ยนเส้นทางแบบคลาสสิกที่เปลี่ยนเส้นทางเฉพาะเอาต์พุตมาตรฐานที่มีข้อผิดพลาดมาตรฐานที่แสดงในเทอร์มินัล เราจะสาธิตตัวเลือกต่าง ๆ เพื่อเปลี่ยนเส้นทาง stderr เช่นกัน

การเปลี่ยนเส้นทาง stderr และ stdout ไปยังไฟล์แยกกัน:

ด้านล่างนี้คือรูปแบบคำสั่งสำหรับเปลี่ยนเส้นทาง stdout และ stderr ไปยังไฟล์แยกกัน

สั่งการ >ออก2>ข้อผิดพลาด

คำสั่งด้านล่างจะเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์ออกและข้อความแสดงข้อผิดพลาดไปยังไฟล์ข้อผิดพลาด

$แมวตัวอย่าง.txt>ออก2>ข้อผิดพลาด

กำลังเปลี่ยนเส้นทาง stderr เป็น stdout:

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

สั่งการ >ออก2> &1$ลส >samplefile.txt2> &1

$แมวsamplefile.txt

> การเปลี่ยนเส้นทางออกเปลี่ยนเส้นทาง stdout ไปที่ samplefile.txt และ 2>&1 จะเปลี่ยนเส้นทาง stderr ไปยังตำแหน่งปัจจุบันของ stdout

หาก stderr ถูกเปลี่ยนเส้นทางไปที่ stdout ก่อน ให้ใช้คำสั่งด้านล่างเพื่อเปลี่ยนเส้นทาง stdout ไปยังไฟล์

สั่งการ 2> &1 > ไฟล์$ลส - ถึง 2> &1 >samplefile.txt

$แมวsamplefile.txt

&> ยังใช้สำหรับฟังก์ชันเดียวกันกับที่2>&1 ทำงาน

สั่งการ &> ไฟล์$ลส &>samplefile.txt

$แมวsamplefile.txt

การเปลี่ยนเส้นทาง stdout และ stderr เป็นไฟล์เดียว:

เชลล์ทั้งหมดไม่รองรับการเปลี่ยนเส้นทางแบบฟอร์มนี้ แต่ bash และ Zsh รองรับ Stdout และ stderr สามารถเปลี่ยนเส้นทางได้โดยใช้ไวยากรณ์ต่อไปนี้

สั่งการ &>ออก$แมวตัวอย่าง.txt&>ออก

ในส่วนถัดไปของบทความ เราจะตรวจสอบตัวอย่างแยกกันสำหรับการเปลี่ยนเส้นทาง stdout และ stderr

การเปลี่ยนเส้นทาง stdout ไปยังไฟล์:

เอาต์พุตมาตรฐานแสดงด้วย 1 ในรายการหมายเลขตัวอธิบายไฟล์ สำหรับคำสั่งเปลี่ยนเส้นทางโดยไม่มีหมายเลข file descriptor เทอร์มินัลตั้งค่าเป็น 1 ไวยากรณ์สำหรับการเปลี่ยนเส้นทาง stdout ไปยังไฟล์มีดังต่อไปนี้:

สั่งการ > ไฟล์

เรากำลังใช้ sample.file เพื่อจัดเก็บเอาต์พุตมาตรฐานของคำสั่ง ls -al

$ลส - ถึง >ตัวอย่าง.txt

$แมวตัวอย่าง.txt

สั่งการ 1> ไฟล์$ลส 1>ตัวอย่าง.txt

$แมวตัวอย่าง.txt

การเปลี่ยนเส้นทาง stderr ไปยังไฟล์:

ใช้ตัวดำเนินการ 2> เพื่อเปลี่ยนเส้นทาง stderr ไปยังไฟล์

สั่งการ 2> ไฟล์ $ลส - ถึง 2>ตัวอย่าง.txt

เราสามารถรวมการดำเนินการสำหรับ stderr และ stdout ไว้ในคำสั่งการเปลี่ยนเส้นทางเดียว

สั่งการ 2>error.txt1>output.txt

ในตัวอย่างด้านล่าง ข้อความแสดงข้อผิดพลาดจะถูกเก็บไว้ใน error.txt โดยที่ output.txt จะมีเอาต์พุตมาตรฐานของคำสั่ง ls

$ลส 2>error.txt1>output.txt

$แมวoutput.txt

บทสรุป:

การมีแนวคิดเกี่ยวกับการเปลี่ยนเส้นทางและตัวอธิบายไฟล์สำหรับสตรีม I/O นั้นมีค่ามากในขณะที่ทำงานในเทอร์มินัล Linux ในโพสต์นี้ เราได้พูดถึงสตรีม I/O ปกติแล้ว รวมถึง stdout และ stderr ส่วนแรกของโพสต์นี้จะแสดงข้อมูลโดยละเอียดเกี่ยวกับการเปลี่ยนเส้นทาง สตรีม I/O และตัวอธิบายไฟล์ที่เป็นตัวเลข ต่อไป คุณได้เห็นตัวอย่างที่ใช้งานได้จริงสำหรับการเปลี่ยนเส้นทาง stdout และ stderr ในรูปแบบต่างๆ