Tuhaf kontrol-d davranışı


9

catYaparak çok basit bir metin editörü olarak kullanabilirim cat > foo.txt.
Ben sonra yazın:

bar
baz

ve ctrl+ tuşlarına basın D, şimdi şöyle görünür:

$ cat > foo.txt
bar
baz^D

imleç ile ^. Daha sonra bir kez daha basarsam dosya kaydedilir. Ancak başka bir şeye basarsam (tamam belki hiçbir şey değil, çoğunlukla herhangi bir şey), sadece dosyayı düzenlemeye devam ediyorum.

Bu normal bir davranış mı?

Yanıtlar:


13

Evet. O ile ilgisi var ^Dgerçekten yapar: sadece şimdiki durur read(2)çağrıyı.

Program yaparsa int rdbytes = read(fd, buffer, sizeof buffer);ve aralarına basarsanız , arabellekte okunan ^Dbaytlarla read()döner ve sayılarını döndürür. Aynı şey hat sonlandırmasında da olur; \nsonunda hep teslim edilir.

Dolayısıyla, sadece bir ^Dhattın başlangıcında veya bir diğerinin ardından , EOF'u ^Dişaret eden read()geri dönüşün istenen etkisi vardır 0.


Bir satırın ne olacağını tanımladığınıza bağlıdır (izleyen veya izlemeden \n.. ancak ^Dart arda iki kez basmak ve son satırsonu karakteri oluşturmadan EOF durumuna neden olmak mümkündür (yapmadan önce Enter tuşuna basarak ^D).
Peter.O

Haklısın, şunu belirtmeyi unuttum: Satır başlangıcı ve "sadece ^ D'ye basıldı" ara belleğin boş olduğu iki durumdur, bu nedenle ^ D read()dönerek 0EOF'u gösterecektir.
glglgl

11

Evet, bu normal bir davranış. Tek bir Control-D normalde yalnızca hattın başlangıcıysa patlar. Bu bir Control-D ile çıkar:

$ cat > foo.txt
bar
baz
^D

Bir hattın sonunda iki kez Control-D, yeni bir satır çizgisi olmadan
patlar

Evet haklısın. Başka türlü ima etmek istememiştim. Cevabımı açıklığa kavuşturmak için düzenledim.
Klox
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.