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.