Ctrl + D สำหรับสิ้นสุดอินพุตบรรทัดของเทอร์มินัล


21

ถ้าฉันทำ

$ cat > file.txt

ข้อความCtrl- DCtrl-D

คำถามที่ 1: ถ้าฉันไม่กด Enter ทำไมฉันต้องกดCtrl- Dสองครั้ง?

ถ้าฉันทำ

$ cat > file.txt

pa bam pshhh Ctrl-Z

[2]+  Stopped         cat > file.txt
$ cat file.txt
$ cat > file.txt

pa bam pshhh

Ctrl-Z

[2]+  Stopped         cat > file.txt
$ cat file.txt
pa bam pshhh

ทำไมไฟล์ที่มี 1 บรรทัดถึงสองครั้ง


2
ด้ายภายใต้เว็บไซต์ stackexchange นี้ร่มมีคำตอบที่คุณกำลังมองหาที่: stackoverflow.com/questions/7369170/... หวังว่ามันจะช่วย

ใช่แม้ว่าจะไม่เกี่ยวข้องกับงูหลาม แต่คำถามของฉันก็เหมือนกัน
หมอก

เมื่อคุณพิมพ์ ctrl-z คุณจะได้รับแค่ shell prompt ใหม่หรือคุณได้รับข้อความเกี่ยวกับcatการหยุดทำงานหรือไม่?
Mark Plotnick

ฉันจะอัปเดตคำถาม
หมอก

คำตอบ:


30

ใน Unix วัตถุส่วนใหญ่ที่คุณสามารถอ่านและเขียนได้ - ไฟล์ธรรมดา, ท่อ, เทอร์มินัล, ดิสก์ไดรฟ์ดิบ - ทั้งหมดถูกสร้างขึ้นให้มีลักษณะคล้ายกับไฟล์

โปรแกรมเช่นcatอ่านจากอินพุตมาตรฐานเช่นนี้:

n = read(0, buffer, 512);

ซึ่งขอ 512 ไบต์ nคือจำนวนไบต์ที่อ่านจริงหรือ -1 ถ้ามีข้อผิดพลาด

หากคุณทำสิ่งนี้ซ้ำ ๆ กับไฟล์ธรรมดาคุณจะได้รับการอ่านแบบ 512 ไบต์จากนั้นอ่านได้ค่อนข้างสั้นที่ส่วนท้ายของไฟล์จากนั้น 0 ถ้าคุณพยายามอ่านจนจบไฟล์ ดังนั้นcatจะทำงานจนกว่าnจะเป็น <= 0

การอ่านจากเทอร์มินัลแตกต่างกันเล็กน้อย หลังจากที่คุณพิมพ์ในบรรทัดยกเลิกโดยEnterคีย์readส่งกลับเพียงบรรทัดนั้น

มีอักขระพิเศษบางตัวที่คุณสามารถพิมพ์ได้ Ctrl-Dหนึ่งในนั้นคือ เมื่อคุณพิมพ์สิ่งนี้ระบบปฏิบัติการจะส่งบรรทัดปัจจุบันทั้งหมดที่คุณพิมพ์ (แต่ไม่ใช่Ctrl-Dตัวเอง) ไปยังโปรแกรมที่ทำการอ่าน และนี่คือสิ่งที่บังเอิญ: ถ้าCtrl-Dเป็นตัวอักษรตัวแรกในบรรทัดโปรแกรมจะส่งความยาว 0 บรรทัด - เหมือนกับโปรแกรมจะดูว่ามันถึงจุดสิ้นสุดของไฟล์ธรรมดาหรือไม่ cat ไม่จำเป็นต้องทำอะไรที่แตกต่างไม่ว่าจะเป็นการอ่านจากไฟล์ธรรมดาหรือเทอร์มินัล

Ctrl-Zตัวละครอื่นเป็นพิเศษคือ เมื่อคุณพิมพ์ที่ใดก็ได้ในบรรทัดระบบปฏิบัติการจะลบสิ่งที่คุณพิมพ์จนกระทั่งถึงจุดนั้นและส่งสัญญาณ SIGTSTP ไปยังโปรแกรมซึ่งโดยปกติจะหยุด (หยุดชั่วคราว) และส่งคืนการควบคุมไปยังเชลล์

ดังนั้นในตัวอย่างของคุณ

$ cat > file.txt
pa bam pshhh<Ctrl+Z>
[2]+  Stopped         cat > file.txt

คุณพิมพ์อักขระบางตัวที่ถูกละทิ้งจากนั้นcatก็หยุดโดยไม่ต้องเขียนอะไรลงในไฟล์เอาต์พุต

$ cat > file.txt
pa bam pshhh
<Ctrl+Z>
[2]+  Stopped         cat > file.txt

คุณพิมพ์ไว้ในหนึ่งบรรทัดที่catอ่านและเขียนไปยังแฟ้มผลลัพธ์ของมันแล้วหยุดCtrl-Zcat


1
สิ่งเหล่านี้เป็นเพียงที่แท้จริงของขั้วโหมดที่ยอมรับ และแม้แต่ในกรณีนั้นพวกเขาสามารถเปลี่ยนแปลงได้
mikeserv

@mikeserv นั่นเป็นเรื่องจริง ที่นี่ฉันต้องการอธิบายว่า OP เห็นอะไรบ้าง ฉันพิจารณาถึงการอธิบายโหมดเทอร์มินัลแบบ raw / -icanon ตัวละครพิเศษอื่น ๆ วิธีปรับแต่งความแตกต่างของระบบปฏิบัติการ ฯลฯ แต่ไม่ต้องการคำตอบนานเกินไป
Mark Plotnick

ข้างต้นหมายความว่าหากอินพุตไม่ผ่านcatโปรแกรมที่อ่านข้อมูลจากแป้นพิมพ์และไม่หยุดในครั้งแรกที่readให้ศูนย์สามารถดำเนินต่อไปได้และจำนวนการควบคุมที่ต้องการจะถูกกำหนดโดย จำนวนศูนย์ติดต่อกันเป็นโปรแกรมที่จำเป็นในการตัดสินใจว่ามันเสร็จแล้ว?
supercat

@supercat โปรแกรมสามารถอ่านต่อไปได้หากต้องการ ในตัวexแก้ไขหากคุณพิมพ์ control-D เป็นตัวอักษรตัวแรกของบรรทัดตัวแก้ไขจะแสดงโปรแกรมสองสามบรรทัดแทนที่จะออก (ในexและviControl-D เป็นตัวช่วยจำสำหรับ "ลง") และด้วยเชลล์จำนวนมากหากคุณพิมพ์ Control-D แต่มีงานที่กำลังทำงานอยู่ในพื้นหลังเชลล์จะแจ้งให้คุณทราบถึงสิ่งนี้แทนที่จะออก แต่ถ้าคุณพิมพ์ Control-D อีกครั้งเชลล์จะตัดสินใจว่าคุณต้องการออกจริง ๆ จะทำเช่นนั้น
Mark Plotnick

@ MarkPlotnick: มีวิธีใดที่อาการสะอึก zero-byte เหล่านี้สามารถส่งผ่านทางท่อได้หรือไม่?
supercat

19

นั่นเป็นเพราะCtrl+ Dคือแฮ็ค

ลึกลงไปCtrl+ D(แม้จะถูกเรียกว่าeofตัวอักษร ) ไม่ได้หมายถึงจุดสิ้นสุดไฟล์จริง ๆ นั่นหมายความว่า“ ส่งอินพุตที่ค้างอยู่ไปยังแอปพลิเคชันทันที” นี่ใกล้เคียงกับความหมายของCtrl+ M( eol) ซึ่งส่งอินพุตที่ค้างอยู่บวกกับการขึ้นบรรทัดใหม่

เมื่อคุณกดCtrl+ DทันทีหลังจากCtrl+ M(เช่นที่จุดเริ่มต้นของบรรทัด) หรือหลังCtrl+ อีกครั้งDอินพุตที่ค้างอยู่จะว่างเปล่า ดังนั้นแอปพลิเคชันจะได้รับอินพุต 0 ไบต์ ในการreadโทรการอ่าน 0 ไบต์จะส่งสัญญาณการสิ้นสุดของไฟล์


เมื่อคุณกดCtrl+ Zอินพุตที่ค้างอยู่จะถูกยกเลิก ดังนั้นเฉพาะสิ่งที่ถูกส่งไปยังแอปพลิเคชัน (ซึ่งคือcat) โดยการป้อนขึ้นบรรทัดใหม่หรือCtrl+ Dก่อนที่จะกดCtrl+ Zจะถูกประมวลผล


1
ข้อมูลเพิ่มเติมเกี่ยวกับ Ctrl + D จากหนึ่งในคำตอบ Gille อาจพบได้ที่นี่
Ramesh

ดังที่คุณพูด Ctrl-D ไม่ได้หมายถึงการสิ้นสุดไฟล์ ในความเป็นจริงเหตุผลมันไม่ได้หมายความว่าเป็นเพราะ Ctrl-D เป็น EOT (จุดสิ้นสุดของข้อความ)
H2ONaCl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.