มีความสำคัญกับการใช้ทีหรือไม่?


47

ทำไมคำสั่งเกือบทั้งหมดเกี่ยวกับการต่อท้ายข้อความในไฟล์ระบบที่ชอบfstabและ/etc/apt/sources.list.d/<name>.listเกี่ยวข้องกับการใช้tee และ echoการต่อท้ายข้อความดังกล่าว?

นำตัวอย่างต่อไปนี้ซึ่งทำงานเป็นรูท :

## 1
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee -a file1
## 2
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' >> file2

วิ่งdiff -u file1 file2กลับไม่มีอะไร การทำงานmd5sum file1 file2แสดงเช็คซัมของพวกเขาเหมือนกันซึ่งทำให้ฉันกลับไปที่คำถามเดิมของฉัน:

เหตุใด| tee <FILENAME>จึงแพร่หลายทั่วทั้งเอกสาร Ubuntu มันเป็นเพียงการปฏิบัติที่ดีมิฉะนั้นมันจะง่ายกว่าที่จะใช้ตัวอย่างที่ 2 แทนที่จะส่งผ่านผลลัพธ์จากechoไปยังtee?


1
คุณหายไปในคำสั่ง sudo; ที่จะแสดงผลลัพธ์ที่แตกต่างระหว่าง 2;)
Rinzwind

1
@Rinzwind ฉันใช้คำสั่งเหล่านี้เป็น root
Alexej Magura

คำตอบ:


82

มีความแตกต่างคือ: tee ทำซ้ำเอาต์พุต: ส่งทั้งไฟล์และจอแสดงผล

แต่มีเพิ่มเติม:

  • ตัวอย่างเช่นหากคุณต้องการเขียนสตริงลงในสองไฟล์พร้อมกันคำสั่งที่มีทีคุณสามารถใช้ได้คือ:

     echo "some text" | tee file1 > file2  
    
  • อีกสิ่งที่ทีสามารถช่วยคุณได้คือหลีกเลี่ยงปัญหาหนึ่งเมื่อใช้ sudo โอเปอเรเตอร์การเปลี่ยนเส้นทางเอาต์พุตปกติจะถูกดำเนินการด้วยสิทธิ์ผู้ใช้ของคุณเสมอรวมถึงเมื่อคุณเขียน sudo หน้าคำสั่งที่สร้างข้อความ STDOUT กล่าวอีกนัยหนึ่งสิ่งนี้จะล้มเหลวหากคุณไม่ได้รับอนุญาตให้เขียนไฟล์ดังกล่าว:

     sudo echo "something" > bar  
    

    แต่ด้วยการทีทุกอย่างจะไปได้ด้วยดี:

    echo "something" | sudo tee bar  
    

2 ตัวอย่างจากไซต์นี้ มันมีอะไรมากกว่านี้


คุณสามารถทำได้sudoโดยไม่ต้องtee- sudo sh -c 'echo SOMETHING > FILE'... ;)
Wilf

7
@wilf ใช่ แต่เมื่อคุณต้องการส่งคำพูดออก"มาสิ่งต่าง ๆ จะยุ่งเหยิง
Braiam

3
ในกรณีแรกถ้าคุณต้องการเขียนลงไฟล์ N ฉันต้องการecho "some text" | tee file1 file2 ... fileNและผนวก> /dev/nullถ้าคุณไม่ต้องการถ่วงใน stdout
Elmar Zander

Nice one @ElmarZander :)
Rinzwind

13

teeใช้เวลากระแสอินพุตมาตรฐานและเขียนมันทั้งกระแสออกมาตรฐานเช่นเดียวกับสตรีมไฟล์ ถ้ามันช่วยให้ผู้คนจำได้ชื่อคำสั่งนั้นมาจากตัวแยก T ในระบบประปา มีบทความ Wikipedia ที่ดีที่ฉันได้เรียนรู้เกี่ยวกับที่มาของชื่อคำสั่ง

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่


11

แรกของทุกตัวเองไม่ได้เพิ่มข้อความหรือไม่tee>

มันเป็นtee -aและส่วนประกอบของ>>ข้อความที่ผนวก

ฉันไม่เชื่อว่าเชลล์ทั้งหมดสนับสนุน>>ฟังก์ชั่นดังนั้นจึงteeเป็นที่นิยมใช้กันมากขึ้น (คิดว่าแค่เก่าธรรมดาsh) Tee เป็นคำสั่งในขณะที่>>เป็นโอเปอเรเตอร์

ถ้าคุณใช้ (ชื่นชอบส่วนตัวของฉัน) bash, >และ>>มีมาก nicer / ง่ายขึ้น

ใช้teeยังช่วยให้คุณ sudo เพียงคำสั่งที่เพื่อให้คุณไม่ต้อง sudo sudo sh -c "echo foo > bar"คำสั่งทั้งหมดในขณะที่ teeยังช่วยให้คุณสามารถแยกเอาท์พุท man teeแน่นอนว่าทั้งหมดนี้สามารถเห็นได้ใน มันเป็นเพียงแค่การตั้งค่าส่วนตัวของคุณ

สำหรับการอ่านเพิ่มเติมโปรดดูที่นี่และที่นี่


5
ชี้แจงผลการดำเนิน sudo "เพียงแค่ว่าคำสั่ง" สำหรับทุกคนที่หานี้น้อยซับซ้อน: โดยใช้แบบฟอร์มเหมือนsudo somecommand >> fileaจะทำงานsudo somecommandแล้วขณะที่กล่าวอ้างfileaของผู้ใช้ผนวกออกไป การใช้sudo sh -c "somecommand >> filea"ผลงาน แต่อาจทำให้ฝันร้ายซ้อนกัน การใช้somecommand | sudo tee -a fileaทำงานsomecommandเป็นผู้ใช้ที่เรียกใช้แล้วผนวกเอาท์พุทfileaเป็นแบบรูทซึ่งโดยปกติจะเป็นสิ่งที่ผู้ใช้ต้องการ
Darael

@Darael ฉันแก้ไขโพสต์ ขอบคุณสำหรับการชี้แจง
Kaz Wolfe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.