การเปลี่ยนเส้นทางแมว


11

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

cat abc > abc

ทำไมเนื้อหาของไฟล์ถึงabcหายไป?
ทำไมคำสั่งลบข้อความในนั้นและไฟล์จะกลายเป็นไฟล์ว่างเปล่า?



10
เลเซอร์ชี้เป็นเครื่องมือที่มีประสิทธิภาพมากสำหรับการเปลี่ยนเส้นทางแมว </pun>
WBT

แมวของฉันตอบสนองต่อการเปลี่ยนเส้นทางได้ไม่ดีมาก ...
Um Umbris

เพื่อหลีกเลี่ยงปัญหานี้ฉันใช้ shellscript เล็กน้อยซึ่งฉันเรียกว่าdog :cat abc | dog abc
joeytwiddle

teeอีกตัวเลือกหนึ่งถ้าคุณไม่คิดเอาท์พุทบนหน้าจอคือการใช้
Andrea Lazzarotto

คำตอบ:


27

เนื่องจากการสั่งซื้อสิ่งที่จะทำ

เมื่อคุณทำ:

cat abc > abc

>เป็นผู้ประกอบการเปลี่ยนเส้นทางการส่งออกเมื่อเปลือกเห็นว่านี่จะเปิดไฟล์ในโหมดการตัดโดยใช้O_TRUNCธงด้วยopen(2)เช่นopen("abc", O_TRUNC)ดังนั้นสิ่งที่มีอยู่ในไฟล์จะหายไป โปรดทราบว่าการเปลี่ยนเส้นทางนี้ทำโดยเชลล์ก่อนที่catคำสั่งจะทำงาน

ดังนั้นเมื่อคำสั่ง cat abcดำเนินการไฟล์abcจะถูกตัดทอนแล้วดังนั้นcatจะพบไฟล์ที่ว่างเปล่า


1
cat abc >> abc เกี่ยวกับอะไร? จะเกิดอะไรขึ้น?
Tulsi Kanodia

2
@TulsiKanodia - ทำให้เกิดการวนซ้ำไม่สิ้นสุด แต่ละครั้งที่แมวอ่านบรรทัดมันจะผนวกอีกเส้นก่อนที่จะย้ายไปยังบรรทัดถัดไป
user3490

3
สิ่งนี้ถูกตรวจพบและป้องกัน ข้อความcat: filename: input file is output file(ซึ่งfilenameเป็นชื่อไฟล์ที่คุณเลือก) จะถูกพิมพ์ลงบน stdout เก่าแทน
UTF-8


5

การเพิ่มคำตอบของ @ heemaylหากคุณต้องการให้รหัสมีความชัดเจนมากขึ้นเกี่ยวกับลำดับที่สิ่งต่าง ๆ กำลังเกิดขึ้นคุณสามารถทำการเปลี่ยนเส้นทางใด ๆ ที่จุดเริ่มต้นของคำสั่ง:

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