Ctrl-D (EOF) neden kabuktan çıkıyor?


68

Bu kaçış sırasını girerek kelimenin tam anlamıyla "bir dosyayı sonlandırıyor musunuz", yani etkileşimli kabuk oturumu diğer herhangi bir dosya akışı gibi kabuk tarafından gerçek bir dosya akışı olarak mı görülüyor? Eğer öyleyse, hangi dosya?

Veya, Ctrl+ Dsinyali yalnızca "kullanıcı girişi sağlamayı bitirdi ve sonlandırabilirsiniz" anlamına gelen bir yer tutucudur mu?



6
Bilginize, bash olarak set -o ignoreeofbu davranışı değiştirmek için yapabilirsiniz .
Keith

Ben de aynı problemi yaşadım. Hatam yanlışlıkla konsole profil kısayolunu "Ctrl + d" ye atadım. Benim en gurur verici anım değil.
Brian Simonsen

Yanıtlar:


78

^DKarakteri (aynı zamanda \04ya da 0x4, İLETİMİ SONU Unicode) için varsayılan değer eofçekirdek uç ya da psödo-terminal sürücü özel bir kontrol karakteri parametresi (daha doğrusu ttyseri veya psödomonasa bağlı hat disiplin tty aygıtı ). Budur c_cc[VEOF]ait termiosTCSETS geçirilen yapısı / TCGETS ioctlsürücü davranışını etkilemek için terminal cihazına bir sorunları.

O gönderir tipik komutu ioctlsolan sttykomut.

Tüm parametreleri almak için:

$ stty -a
hız 38400 baud; sıralar 58; sütunlar 191; çizgi = 0;
intr = ^ C; quit = ^ \; erase = ^ ?; kill = ^ U; eof = ^ D ; eol = <undef>; eol2 = <undef>; SWTCH = <undef>; start = ^ Q; stop = ^ S; süspansiyon = ^ Z; rprnt = ^ R; werase = ^ W; lnext = ^ V; floş = ^ O;
min = 1; süre = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten yankı eko eko eko-eko-eko-hiçbiri -xcase -toptop-eko eko eki eko

Bu eofparametre sadece terminal cihazı icanonmodundayken geçerlidir.

Bu modda, terminal sürücüsü (terminal emülatörü değil) çok basit bir satır düzenleyici uygular Backspace; karakter Ctrl-Usilmek için, tüm satırı silmek için yazabilirsiniz ... Bir uygulama terminal cihazından okuduğunda tuşuna Returnnoktada read()döndürür son dahil olmak üzere tam bir çizgi LFkarakteri (varsayılan olarak, Terminal sürücü ayrıca çevirir CRüzerine senin terminale gönderdiği Returniçin LF).

Şimdiye kadar yazdıklarınızı tuşuna basmadan göndermek istiyorsanız Enter, eofkarakteri girebileceğiniz yer burasıdır . Terminal emülatöründen bu karakteri aldıktan sonra, terminal sürücüsü hattın mevcut içeriğini gönderir , böylece onu yapan uygulama readonu olduğu gibi alır (ve izleyen bir LFkarakter içermez ).

Şimdi, mevcut satır boşsa ve uygulamanın önceden girilmiş satırları tam olarak okuması şartıyla, read0 karakteri geri döndürürse.

Bu , uygulamanın dosyanın sonunu belirtir (bir dosyadan okuduğunuzda okunacak başka bir şey kalmayıncaya kadar okursunuz). Bu yüzden eofkarakter olarak adlandırılır , çünkü onu göndermek uygulamanın daha fazla giriş olmadığını görmesine neden olur.

Şimdi, modern mermiler, istemleri halinde terminali icanonkipte ayarlamıyorlar çünkü dahili hat sürücüsünden çok daha gelişmiş olan kendi satır düzenleyicilerini kullanıyorlar . Bununla birlikte, kendi satır düzenleyicilerinde , kullanıcıların kafasını karıştırmamak için ^Dkaraktere (veya terminalin eofayarlarının ne olduğu ile ilgili) aynı anlamı (belirtmek için eof) verir.


Bir keresinde Stephane tarafından yazılmış bu yorumu okumaya başladığımı biliyordum :) Sen, Stephane, benim Bash kahramanımsınız ve alaycı değilim. Benimle öğle yemeği yemeyi ve şimdiye kadar NYC'de isen beynini seçmeyi çok isterim.
Gregg Leventhal

@GreggLeventhal. Teşekkürler. Yakında her zaman NYC'ye gitme ihtimalim oldukça zayıf.
Stéphane Chazelas

7-Bit ASCII'de bile EOT
Bananguin

9

CTRL_D, bunun bir metin akışının sonu olduğunu söyleyen bir sinyaldir. Onunla bir dosyayı sonlandırmazsınız, giriş akışınızı yazarak sonlandırırsınız. Ayrıca CTRL_D, hexdump aracıyla bulabileceğiniz herhangi bir karakter veya baytı desteklemiyor:

# cat >test.txt
asdf# hexdump -C test.txt 
00000000  61 73 64 66                                       |asdf|
00000004
# ll test.txt 
-rw-r--r-- 1 root root 4 Jan 21 11:55 test.txt

5
Ve kabuğu sona erdirmesinin nedeni, kabuğun temelde girdiyi kabul eden ve onunla iş yapan bir süreç olmasıdır. Daha fazla girdi gelmeyeceğini söylediğinde, kabuğun yapabileceği daha fazla bir şey yok.
Jenny D

EOF dizisinin bir metin dosyası içermediğini ve OS tarafından okunacak başka veri olmadığını bildirmek için üretildiğini fark ediyorum. Sanırım asıl sorduğum, etkileşimli terminal oturumunun diğer dosya akışı gibi kabuk tarafından gerçek bir dosya akışı olarak görülüp görülmediği.
Geeb

Sadece netleştirmek için orijinal soruyu düzenledi.
Geeb

2
evet, bash'a giden akış, diğerleri gibi bir giriş akımıdır. CTRL_D, giriş akışının sonunda olduğunu ve bash'ın çıkabileceğini gösterir.
Thorsten Staerk
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.