Terminal hattı girişini sonlandırmak için Ctrl + D


21

Eğer yaparsam

$ cat > file.txt

metin Ctrl- DCtrl-D

Soru 1: Ben basın girmezseniz, neden basına var Ctrl- Diki kez?

Eğer yaparsam

$ 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

İkinci seferde dosya neden 1 satırlı?


2
Stackexchange siteleri şemsiyesi altındaki bu konu, aradığınız cevaba sahiptir: stackoverflow.com/questions/7369170/… . Umarım yardımcı olur.

Evet, python ile ilgili olmasa da benim sorum yinelemeli.
sis

Ctrl-z yazdığınızda, gerçekten yeni bir kabuk istemi mi alıyorsunuz yoksa catdurdurulma konusunda bir mesaj mı alıyorsunuz ?
Mark Plotnick

Soruyu güncelleyeceğim
sis

Yanıtlar:


30

Unix'te okuyabildiğiniz ve yazabildiğiniz çoğu nesne - sıradan dosyalar, borular, terminaller, ham disk sürücüleri - hepsi dosyalara benzeyecek şekilde yapılmıştır.

Gibi bir program catşöyle onun standart girişinden okur:

n = read(0, buffer, 512);

512 bayt için sorar. ngerçekte okunan bayt sayısı, hata varsa -1.

Bunu sıradan bir dosya ile tekrar tekrar yaparsanız, bir sürü 512 baytlık okuma alırsınız, daha sonra dosyanın kuyruk ucunda biraz daha kısa, daha sonra dosyanın sonuna kadar okumaya kalkarsanız, 0 okursunuz. Yani, <= 0 catolana kadar çalışacaktır n.

Bir terminalden okumak biraz farklıdır. EnterAnahtar ile sonlandırılan bir satır yazdıktan sonra , readsadece o satırı döndürür.

Yazabileceğiniz birkaç özel karakter var. Birincisi Ctrl-D. Bunu yazdığınızda, işletim sistemi yazdığınız mevcut satırın tamamını (ancak Ctrl-Dkendisini değil ) okumayı yapan programa gönderir . Ve işte serendipitous şey: Ctrl-Dsatırdaki ilk karakter ise, program 0 uzunluğunda bir satır gönderilir - tıpkı programın sıradan bir dosyanın sonuna gelip gelmediğini görmesi gibi. Sıradan bir dosyadan veya terminalden okuyor olsun, cat farklı bir şey yapmanıza gerek yoktur .

Başka bir özel karakter Ctrl-Z. Bir satırın herhangi bir yerine yazdığınızda, işletim sistemi o noktaya kadar yazdığınız her şeyi atar ve programa bir SIGTSTP sinyali gönderir, bu program normalde durur (duraklar) ve kabuğa kontrolü döndürür.

Yani senin örneğinde

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

atılan bazı karakterleri yazdınız cat, çıktı dosyasına hiçbir şey yazmadan durduruldunuz.

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

catçıktı dosyasını okuyan ve yazan bir satır yazdınız ve sonra Ctrl-Zdurdunuz cat.


1
bunlar sadece kanonik mod klemensleri için geçerlidir . Ve bu durumda bile değiştirilebilirler.
mikeserv

@mikeserv Bu doğru. Burada OP'nin ne gördüğünü açıklamak istedim. Ayrıca ham / -icanon terminal modunu, diğer özel karakterleri, nasıl özelleştirilebileceklerini, işletim sistemlerine göre nasıl farklılık gösterdiklerini vb. Tanımlamayı da düşündüm, ancak cevabı çok uzun süre yapmak istemedim.
Mark Plotnick

Yukarıdakiler, eğer giriş yapılmadıysa cat, klavyeden veri okuyan ve ilk kez readsıfır vermeyen bir programın devam edebileceğini ve gerekli kontrol-D sayısını belirleyeceği anlamına mı geliyor? ardışık sıfır sayısı, programın yapılmasına karar vermek için gerekli?
supercat,

@supercat Bir program isterse okumaya devam edebilir. In exeditör, bir satırın ilk karakteri, editör gösterileri size programın yerine çıkmadan bir kaç satır olarak bir kontrol-D yazarsanız. (İçinde exve viKontrol-D "aşağı" için bir anımsatıcı). Ve birçok kabukla, Control-D yazarsanız fakat arka planda çalışan işler varsa, kabuk sizi çıkmak yerine bu konuda bilgilendirir, ancak yine de Control-D yazarsanız, kabuk yine de çıkmak istediğinize karar verir ve öyle yapacağım.
Mark Plotnick

@MarkPlotnick: Bu sıfır bayt hıçkırıklarının boru yoluyla gönderilmesinin bir yolu var mı?
supercat,

19

Çünkü Ctrl+ Dbir hack.

Derinlerde, Ctrl+ D( eofkarakter olarak adlandırılmasına rağmen ) aslında dosya sonu anlamına gelmez: “bekleyen girişi şimdi uygulamaya gönder” anlamına gelir. Bu aslında bekleyen girişi ve yeni bir satır gönderen Ctrl+ M( eol) anlamına yakın .

Eğer bastığınızda Ctrl+ Dhemen sonra Ctrl+ M(bir satırın başında yani) ya da birbiri ardına Ctrl+ Dbekleyen girdi boştur. Böylece uygulama 0 bayt girdi alır. Bir readaramada 0 bayt okumak dosyanın sonuna işaret eder.


Ctrl+ Tuşuna bastığınızda Z, bekleyen giriş atılır. Böylece yalnızca önceden uygulama (hangi gönderilen edilmişti ne catbir yeni satır girerek veya tarafından) Ctrl+ Dbasmadan önce Ctrl+ Zişlenir.


1
Gille'in yanıtlarından birinden ctrl + D ile ilgili daha fazla bilgiyi burada bulabilirsiniz .
Ramesh

Dediğiniz gibi, Ctrl-D, dosyanın sonu anlamına gelmez. Aslında, bunun nedeni Ctrl-D'nin EOT (metnin sonu) olduğu anlamına gelmez.
H2ONaCl
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.