Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

เชี่ยวชาญคำสั่ง tee ใน Linux: แบ่ง Output ไปยังไฟล์และคอนโซลพร้อมกัน

คำสั่ง tee ใน Linux Shell/บรรทัดคำสั่ง แบ่งเอาต์พุทของแอปพลิเคชัน – ส่งเอาต์พุทไปยังทั้งไฟล์ และ STDOUT (คอนโซลหรือแอปพลิเคชันอื่น) นี่คือวิธีใช้งาน

คำสั่ง tee ได้ชื่อมาจาก T-splitter ที่ใช้ในงานประปา – ท่อที่เปลี่ยนทิศทางน้ำจากแหล่งเดียวไปสองทิศทาง

ไวยากรณ์คำสั่ง tee

tee เป็นคำสั่งที่มีวัตถุประสงค์และไวยากรณ์ง่ายๆ:

tee OPTIONS FILE

โปรดทราบว่า:

  • OPTIONS เป็นรายการตัวเลือกจากตารางด้านล่าง
  • FILE คือเส้นทางไปยังไฟล์ที่คุณต้องการให้เอาต์พุทถูกบันทึก
  • Input ต้องถูก pipe หรือ redirect ไปยัง tee – มิฉะนั้นมันไม่มีอะไรให้ทำงาน
    • สิ่งนี้ทำได้โดยการ redirect standard input/output – ดูตัวอย่างด้านล่าง
  • tee จะส่งออกข้อมูลที่ให้มา ทั้งไปยัง FILE ที่ระบุ และ STDOUT (standard output)
    • โดยค่าเริ่มต้นจะแสดงบนคอนโซล แต่สามารถ redirect ไปยังแอปพลิเคชันอื่นได้

ตัวเลือก (Options)

นี่คือตัวเลือกที่ใช้บ่อยที่สุดสำหรับคำสั่ง tee:

ตัวเลือก คำอธิบาย
-a, --append ต่อท้าย (append) ไปยัง FILE ที่กำหนด ไม่เขียนทับ
-i, --ignore-interrupts ละเลยสัญญาณ interrupt

สำหรับตัวเลือกเพิ่มเติม รวมถึงวิธีวินิจฉัยข้อผิดพลาด คุณสามารถดูคู่มือผู้ใช้ได้โดยรัน:

man tee

ตัวอย่างคำสั่ง tee

นี่คือตัวอย่างง่ายๆ ของการใช้ tee

ตัวอย่างทั้งหมดนี้ใช้คำสั่ง echo ซึ่งเพียงแค่ส่งออกข้อความที่ให้มา

ดูและบันทึก Output จากคำสั่งไปยังไฟล์ใหม่

ผลลัพธ์ของคำสั่ง echo จะถูก pipe ไปยัง tee ซึ่งจะบันทึกลงไฟล์และแสดงบนคอนโซลพร้อมกัน:

echo "hello!" | tee hello.txt

หากไฟล์ hello.txt มีอยู่แล้ว จะถูกเขียนทับ

ดูและบันทึก Output จากคำสั่งไปยังไฟล์ที่มีอยู่

ตัวอย่างนี้ทำเหมือนข้างต้น แต่จะต่อท้ายไปที่ท้ายไฟล์ที่มีอยู่ แทนที่จะเขียนทับ:

echo "hello again!" | tee -a hello.txt

บันทึกหรือต่อท้าย Output ไปยังหลายไฟล์

สามารถระบุหลายไฟล์ได้ คั่นด้วยช่องว่าง:

echo "hello several files!" | tee hello1.txt hello2.txt hello3.txt

Redirect/Pipe Output ของ tee

Standard output ของ tee สามารถ pipe และ redirect ได้ ตัวอย่างด้านล่างจะบันทึกผลลัพธ์ของ echo ไป hello.txt แล้ว output จะถูกส่งต่อไปยังคำสั่ง grep แทนที่จะแสดงบนคอนโซล:

echo "hello!" | tee hello.txt | grep hello

เพื่อตัวอย่าง grep command (ซึ่งใช้ค้นหาข้อความในอินพุท) เพียงแค่ค้นหาคำว่า "hello" จาก output ของ tee

การละเลย Interrupts

การละเลย interrupts (เช่น กด CTRL + C เพื่อออกจากคำสั่ง) สามารถทำให้ output จาก tee สะอาดขึ้น:

echo "hello!" | tee -i hello.txt

การใช้ tee กับ sudo

คำสั่ง sudo อนุญาตให้คุณรันคำสั่งเป็น root user โดยไม่ต้องล็อกอินเป็น root และมักใช้กัน

ใน snippet ต่อไปนี้ – sudo ไม่ อนุญาตให้คุณ redirect output ของคำสั่ง เนื่องจากคำสั่ง sudo เองไม่ได้ทำการ redirect เนื่องจากมันปรากฏก่อนสัญลักษณ์ redirect (>):

sudo echo "hello!" > /root/hello.txt

…สิ่งนี้จะล้มเหลวพร้อมข้อผิดพลาดสิทธิ์ เนื่องจากไดเรกทอรี /root ต้องการสิทธิ์ root แต่คำสั่ง sudo ใช้สิทธิ์เหล่านี้กับคำสั่ง echo เท่านั้น – ไม่ใช่ redirect ที่มาหลัง

เทคนิคเพื่อหลีกเลี่ยงเรื่องนี้คือใช้คำสั่ง tee:

echo "hello!" | sudo tee /root/hello.txt

สิ่งนี้จะทำงาน เพราะ output ของคำสั่ง echo ถูกส่งไปยัง tee ซึ่ง กำลัง รันด้วยสิทธิ์ผู้ดูแลระบบผ่าน sudo – และ tee บันทึก output