พฤติกรรมการควบคุม -d แปลก


9

ฉันสามารถใช้เป็นโปรแกรมแก้ไขข้อความที่ง่ายมากโดยการทำcat ถ้าฉันพิมพ์แล้ว:cat > foo.txt

bar
baz

จากนั้นกดctrl+ Dตอนนี้จะมีลักษณะดังนี้:

$ cat > foo.txt
bar
baz^D

^ด้วยเคอร์เซอร์ที่ที่ ถ้าฉันกดอีกครั้งไฟล์จะได้รับการบันทึก อย่างไรก็ตามถ้าฉันกดปุ่มอะไรก็ได้ (โอเคอาจจะไม่ใช่ทุกอย่าง แต่ส่วนใหญ่จะเป็นอะไรก็ได้) อื่นฉันก็แค่แก้ไขไฟล์ต่อไป

นี่เป็นพฤติกรรมปกติหรือไม่

คำตอบ:


13

ใช่. มันเกี่ยวข้องกับการทำ^Dจริงๆ: เพียงแค่หยุดการread(2)โทรปัจจุบัน

หากโปรแกรมทำint rdbytes = read(fd, buffer, sizeof buffer);และคุณกดใน^Dระหว่างให้read()ส่งคืนด้วยไบต์ที่อ่านในปัจจุบันในบัฟเฟอร์ส่งคืนหมายเลขของพวกเขา สิ่งเดียวกันนี้เกิดขึ้นเมื่อมีการยกเลิกสาย \nในตอนท้ายจะถูกส่งเสมอ

ดังนั้นเฉพาะ^Dที่จุดเริ่มต้นของบรรทัดหรือหลังจากที่อื่น^Dมีผลที่ต้องการของการread()กลับมา0ส่งสัญญาณ EOF


มันขึ้นอยู่กับสิ่งที่คุณกำหนดเส้นจะเป็น (มีหรือไม่มีต่อท้าย\n.. แต่มันก็เป็นไปได้เพียงแค่กด^Dสองครั้งในการสืบทอดและก่อให้เกิดสภาพ EOF โดยไม่สร้างถ่านขึ้นบรรทัดสุดท้าย (ในขณะที่กด Enter ก่อนที่^Dจะทำ)
Peter.O

ถูกต้องฉันลืมที่จะพูดถึงว่า: เริ่มต้นของบรรทัดและ "เพิ่งกด ^ D" เป็นสองสถานการณ์ที่บัฟเฟอร์ว่างเปล่าดังนั้น ^ D จะread()กลับมา0แสดง EOF
glglgl

11

ใช่นี่เป็นพฤติกรรมปกติ ปกติ Control-D เพียงตัวเดียวจะแยกออกหากเป็นจุดเริ่มต้นของบรรทัด ทางออกนี้มีเพียง Control-D เดียว:

$ cat > foo.txt
bar
baz
^D

ควบคุม-D เป็นครั้งที่สองที่ท้ายบรรทัดไม่แตกออกโดยไม่ต้องถ่านขึ้นบรรทัดใหม่ ...
Peter.O

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