สิ่งพื้นฐานที่คุณต้องเข้าใจในกรณีนี้ระหว่างการเปลี่ยนเส้นทางทั้งสองวิธี (> และ >>) คือ:
>
เปลี่ยนเส้นทางและเขียนทับข้อมูลที่ชี้ไป สิ่งนี้เกิดขึ้นขณะรับข้อมูลใด ๆ ผ่านทางท่อ "|"
>>
เปลี่ยนเส้นทางและต่อข้อมูลที่ชี้ไป สิ่งนี้เกิดขึ้นขณะรับข้อมูลใด ๆ ผ่านทางท่อ "|"
ในทั้งสองกรณีหากไฟล์ไม่มีอยู่ไฟล์นั้นจะถูกสร้างขึ้นแทน เฉพาะใน ">>" ข้อมูลจะถูกต่อกันหากคุณเรียกใช้อีกครั้งในไฟล์เดียวกัน ด้วย ">" คุณจะเขียนทับทุกสิ่งที่คุณทำในการเรียกใช้ครั้งแรก
แต่นี่คือข้อตกลงเมื่อใช้ไฟล์อินพุตเดียวกันกับไฟล์เอาต์พุต ในกรณีดังกล่าวหากคุณใช้ ">" คุณจะต้องลบข้อมูลส่วน "อินพุต" จำเป็นต้องแยกวิเคราะห์เนื่องจากไฟล์เอาต์พุตจะ "เขียนทับมัน" ดังนั้นใน:
rev file.txt | cat > file.txt
สิ่งที่เกิดขึ้นจริงใน "คำอธิบายการเคลื่อนไหวช้า" คือ:
rev
เตรียมที่จะกลับเนื้อหาของfile.txt
และส่งไปยังไปป์
- ในขณะที่จะส่งข้อมูลไปยังท่อท่อลำธารโดยตรงไปยัง
rev
cat
- ในขณะที่
cat
กำลังรับข้อมูลมันจะนำไปใช้โดยอัตโนมัติกับfile.txt
มันถูกตั้งค่าด้วย
- คำหลักที่นี่คือ "ในขณะที่" เพราะทุกอย่างเกิดขึ้นในเวลาเดียวกัน โปรดดูความคิดเห็นที่ยอดเยี่ยมด้านล่างโดย Emil เพื่อทำความเข้าใจอย่างลึกซึ้งในส่วนนี้
cat
จะไม่รอrev
ไปป์ที่ไฟล์ทั้งหมด file.txt
มันก็จะเริ่มต้นนาทีส่วนแรกของข้อมูลที่ได้รับไปซึ่งหมายถึงขึ้นอยู่กับสิ่งที่สัญลักษณ์ที่คุณใช้ก็จะเปิดการเชื่อมต่อกับ
- ในกรณีนี้เนื่องจากคุณใช้>แทน>>เชลล์จะตัดทอนไฟล์เอาท์พุทซึ่งหมายความว่ามันจะเปิดและล้างข้อมูล
file.txt
ในขณะที่รอข้อมูลใหม่เพื่อเข้าใช้ ด้วย>>มันจะเปิดการเชื่อมต่อด้วยfile.txt
และรอข้อมูลใหม่ในบรรทัดสุดท้ายที่ตรวจพบ
- เนื่องจากข้อมูลที่ถูกลบแล้วใน
file.txt
ด้วย> , rev
จะพยายามที่จะทำผลงานของมันและได้รับอะไรเพราะcat
ถูกลบทุกอย่างในการเตรียมการสำหรับข้อมูลใหม่
แล้วทำไมคนอื่นถึงทำงานหลังจากอ่านข้อความข้างต้น ด้วยเหตุนี้:
rev file.txt | cat > file2.txt && mv file.txt file2.txt
ที่นี่คุณกำลังส่งไปยังแมวซึ่งกำลังส่งข้อมูลไปยังไฟล์อื่น ในกรณีนี้แฟ้มใส่ประมวลผลไม่ได้เป็นเช่นเดียวกับไฟล์ที่ส่งออกfile.txt
file2.txt
หลังจากนั้นคุณจะเขียนทับทั้งหมดfile2.txt
ด้วยfile.txt
ดังนั้นกระบวนการทั้งหมดที่ทำโดยcat
ถูกลบ โดยพื้นฐานแล้วทั้งบรรทัดสามารถทำให้ง่ายขึ้นเช่นcp file.txt file2.txt
เพราะมันทำสิ่งเดียวกันตั้งแต่file2.txt
ในตอนท้ายสูญเสียrev
และถูกเขียนทับด้วยmv
คำสั่ง
rev file.txt | cat >> file.txt
ในกรณีนี้คุณกำลังเชื่อมข้อมูลกับไฟล์เดียวกัน ดังนั้นมันจึงเป็นเพียงการเปิดการเชื่อมต่อไปยังแฟ้มที่ แต่ไม่ลบข้อมูลเท่าที่เห็นมีเพียงหนึ่งเดียว> ผลลัพธ์ที่ได้ควรเป็นข้อมูลดั้งเดิมรวมถึงข้อมูลที่กลับด้าน
cat
rev file.txt > file2.txt && mv file2.txt file.txt
นี่คือการใช้ฟุ่มเฟือยของcat
โดยปล่อยให้คุณพล่านวางกระบวนการพิเศษ