UNIX / Mac OS X terminali için ^ C ve ^ D arasındaki fark nedir?


61

Bir şeyi durdurmaya çalıştığımda ^Cbazen ^Dterminalde kullanıyorum.

İkisi arasındaki fark nedir? Neden bazı programı yanıt vermiyor ^C, ancak ^D. Neden Terminal.app kullandığımda sonlandırılıyor ^D?


FYI: Vikipedi sayfalarına bakınız: Control + C tarafından üretilen METİN karakteri U + 0003 END ve Control + D tarafından üretilen METİN SONU karakteri U + 0004.
Basil Bourque

Yanıtlar:


60

CtrlCterminale SIGINT, varsayılan olarak uygulamayı sonlandırmak anlamına gelen geçerli ön plan işlemine bir göndermesini söyler . CtrlDterminale, bash'ın çıkma isteği olarak yorumladığı standart girişe bir EOF kaydetmesi gerektiğini söyler.


62

Ctrl+ D( ^D) , dosyanın sonu anlamına gelir . Yalnızca bir satırın başında çalışır (biraz basitleştiriyorum) ve programın terminalden girdi okumaması durumunda etkisi yoktur. Denemenizde, ^Dkabuğa daha fazla komut yazmayacağınızı söyledi, bu yüzden çıkıldı; daha sonra terminal, alt programı sonlandırıldığı için çıktı.

Ctrl+ C( ^C) “kesme” anlamına gelir, yani ne yaptığınızı durdurun. Teknik olarak, tuşuna basılması , varsayılan olarak bir uygulamayı sonlandıran, ancak çoğu programda en üst seviyeye (örneğin bir kabuğun içinde komut satırını yazmayı bırakıp bozulmamış istemine geri dönme) giden INT sinyalini^C gönderir .

Bir program yanıt vermiyorsa ^C, Ctrl+ \( ^\) yöntemini deneyebilirsiniz . Bu , varsayılan olarak bir uygulamayı sonlandıran ve pek fazla programın kesişmediği QUIT sinyalini gönderir .

Sinyal gönderen başka bir anahtar Ctrl+ Z( ^Z). Ön planda çalışan programı duraklatan TSTP sinyalini gönderir . (TSTP “terminal durdurma” için kısadır; STOP'a benzer, ancak STOP yapamazken TSTP göz ardı edilebilir.) Kabuktan, bu programın fgkomutunu (ön planda devam ettirme) veya bgkomutla (devam ettirme modunda) devam ettirebilirsiniz. arka fon).

Bu tuşların tümü sttykomutuyla değiştirilebilir . Bazı programlar, özellikle anahtar bağlantıları olan tam ekran programlar, bunları devre dışı bırakır.


Küçük bir düzeltme: Control-Z, TSTP (terminal durdurma) sinyalini gönderir. Bu, STOP sinyali olamaz, ancak süreçler tarafından yakalanabilir veya göz ardı edilebilir.
Chris Sayfa

Buna ihtiyacım var! sıkıştı ve dışarı
çıkamadım

1
CTRL-D ile ilgili sadece bir öneri: "şu ana kadar yazdığım girişi temizle" anlamına gelir ve satır boşsa, read () sıfırla döner ve bu "dosyanın sonu" olarak yorumlanır.
luca

Bu süper önemli ve faydalı bir bilgidir; Kapsamlı ve anlaşılır açıklama için teşekkürler
iono

Merak ediyorum, neden kabuk içinde çalışan python progam ctrl + c ile istifa etmiyor, bunun yerine neden soruyor KeyboardInterrupt? Ctrl + d ile (bir satırın başındaysa) ve ctrl + \ ile çıkar.
Rick

2

Yukarıdaki 2 gerçekten iyi cevaplar ekleyerek, işte bir örnek:

Eğer yazarsanız pythonkabuğunda, bu Python en >>> istemine götürür.

Şimdi, vurursanız Ctrl+C, söyler KeyboardInterruptve >>> de kalır.
Eğer döngü için içine girerseniz, yazarak örneğin for x in (text):size bir ... istem görüntüleyerek daha da yazın vurduğunuz takdirde bekler Ctrl+Cşimdi, deyimi için çıkmak ve >>> istemi dönersiniz
Eğer vurursanız Ctrl+DHerhangi bir noktada, >>> veya ... 'da python isteminden çıkacak ve orijinal kabuğa geri dönecektir.

Benzer şekilde, başka bir makineye ssh'lenmişse, Ctrl+Cvarolan herhangi bir komutu sonlandıracak, Ctrl+Dbunu yapacak ve makineden çıkacaktır. (Ayrıca, Deleteanahtar a ile aynıdır Ctrl+D)


Bu cevabı takdir ediyorum. Ancak, kendim için çalışırken bazı yanlışlıklar buldum. Uzaktaki bir makineye ssh'lenmiş ve python işlemini yürütürken, Ctrl + D python'dan çıkıp beni uzaktaki makinenin komut istemine geri götürürken, makineden çıkmadı. Ayrıca, Sil tuşu hiçbir durumda, python çalıştıran, uzak istemde veya yerel istemimde Ctrl + D ile aynı şekilde çalışmadı. Tabii ki python yazarken karakterleri silmek dışında hiçbir şey yapmadı. Bununla birlikte, Ctrl + D yazarken Sil karakteri olarak işlev gördü, karakterleri sildi.
Yığın

1
Bu ilginç, kullandığınız kabuğa (bash, ksh vb.) Bağlı olabileceğini düşünüyorum.
Siddhartha
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.