CTRL + 4 (ve CTRL + \) bash'te ne yapar?


22

Kaza sonucu , komut satırından girdi okuyan programları CTRL+ 4 kapattığını öğrendim stdin.

Okuma programlarına CTRL+ 4veya CTRL+ yazarken böyle gözüküyor/stdin

$ cat
wefwef
wefwef
^\Quit
$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
^\Quit
$

Ben ^\Quitgörüntüleniyor ve program kapanıyor. Bunun ^Cveya kullanmaya kıyasla farkı nedir ^D? Ne yapar ^\Quit?

Düzenleme : CTRL+ \aynı şeyi yaptığını öğrendim .

Yanıtlar:


37

Ctrl + 4 gönderir ^ \

Terminaller, karakterleri (veya daha kesin olarak baytları) anahtar değil gönderir. Yazdırılabilir bir karakteri temsil eden bir tuşa basıldığında, terminal bu karakteri uygulamaya gönderir. İşlev tuşlarının çoğu, kaçış dizileri olarak kodlanır: 27 numaralı karakterle başlayan karakter dizileri. Ctrl+ Formunun bazı tuş dizileri characterve birkaç işlev tuşu, tüm modern bilgisayarların kullandığı ASCII karakter kümesinde , kontrol karakterleri olarak gönderilir. temel olarak kullanın (Unicode, ISO Latin- nvb. ASCII'nin tüm üstkümeleridir), 33 karakter kontrol karakterleridir: 0 - 31 ve 127 karakterleri. Kontrol karakterleri yazdırılamaz, ancak uygulamalarda etkili olması amaçlanmıştır; örneğin, Control-J olan (genellikle ^ J) yazılan 10 karakteri yeni satır karakteridir, bu nedenle bir terminal bu karakteri görüntülediğinde, imleci bir glif görüntülemek yerine bir sonraki satıra taşır. Çıkış karakterinin kendisi bir kontrol karakteridir, ^ [(değer 27).

Tüm Ctrl+ charactertuş başlıklarını kapsayacak kadar kontrol karakteri yok. Sadece harfler ve karakterler @[\]^_?karşılık gelen kontrol karakterine sahiptir. Tuşuna bastığınızda Ctrl+ 4veya Ctrl+ $(I tahmin hangi Ctrl+ Shift+ 4terminal göndermek için bir şey almak için vardır). Terminale ve konfigürasyonuna bağlı olarak, birkaç ortak olasılık vardır:

  • Terminal Ctrldeğiştiriciyi yok sayar ve 4veya karakterini gönderir $.
  • Terminal, tam anahtarı ve basılan değiştiricileri kodlayan bir kaçış dizisi gönderir.
  • Terminal başka bir kontrol karakteri gönderir.

Birçok terminal, rakam satırındaki bazı tuşlar için kontrol karakterleri gönderir:

  • Ctrl+ 2→ ^ @
  • Ctrl+ 3→ ^ [
  • Ctrl+ 4→ ^ \
  • Ctrl+ 5→ ^]
  • Ctrl+ 6→ ^^
  • Ctrl+ 7→ ^ _
  • Ctrl+ 8→ ^

Bu özel sözleşmenin nerede ortaya çıktığını bilmiyorum.

Ctrl+ |aynı karakteri gönderir, çünkü Ctrl+ Shift+ \ve terminal, \ \ shift tuşuna basılıp basılmamasını gönderir.

^ \ quit

Terminalin kendisi (daha doğrusu çekirdekteki genel terminal desteği) özel olarak birkaç kontrol karakterini yorumlar. Bu yorum, farklı karakterleri eşlemek veya karakterleri kendi başına işlemek isteyen uygulamalar tarafından kapatılmak üzere yapılandırılabilir. Bu tür bir yorumlama, Returnanahtarın gönderdiği karakter olan ^ M, eğer terminal pişmiş moddaysa , uygulamaların satır satır girdi alacağı geçerli satırı uygulamaya gönderir .

Birkaç karakter ön plandaki uygulamaya sinyal gönderir . ^ C , geleneksel olarak uygulamaya ne yaptığını durdurmasını ve kullanıcının bir sonraki komutunu okumasını söyleyen kesme sinyalini (SIGINT) gönderir . Etkileşimli olmayan uygulamalar genellikle çıkar. ^ \ geleneksel olarak uygulamaya herhangi bir şeyi kaydetmeden en kısa sürede çıkmasını söyleyen bırakma sinyalini (SIGQUIT) gönderir ; Birçok uygulama, uygulamayı derhal öldürmek olan varsayılan davranışı geçersiz kılmaz. Dolayısıyla, Ctrl+ 4(veya ^ \ karakterini gönderen herhangi bir şeyi) catveya bchiçbirine varsayılan davranışı geçersiz kılmayan bir tuşa bastığınızda , uygulama öldürülür.

Terminal ^\, mesajın bir kısmını basar : yazdığınız karakterin görsel bir tasviridir ve terminal pişmiş moddadır ve yankı açıkken (karakterler yazarken yazdığınız anda terminal tarafından gösterilir) karakterlerin yalnızca uygulamaya gönderildiği, bunları görüntülemeyi seçebilecek veya seçmeyebilecekleri yankı olmayan mod. Bölüm Quitbash'tan geliyor: çocuk sürecinin bir bırakma sinyalinden öldüğünü fark ediyor ve bu size bildirmenin bir yolu.

Kabuklar tüm genel sinyalleri tutar, böylece bir kabuğa ^ \ yazarsanız, oturumunuzu sonlandırmazsanız, ^ C ile aynı şekilde yeni bir komut istemi alırsınız.

sttyKomut ile terminal ayarları ile oynayabilirsiniz .

¹ Ve geleneksel olarak bir çekirdek dökümü üretir , ancak çoğu sistem bugünlerde bunu varsayılan olarak devre dışı bırakır.


SIGINT ön plan işlem grubunu öldürür ve SIGQUIT onu bir çekirdek dökümü ile öldürür. Her iki sinyal de kullanılabilir. Bir sonraki komutu okuyarak ne demek istediğinizi anlamadım . Sistemler, başlangıç ​​coredumpsize sınırını 0'a ayarlamaktan başka çekirdek dökümlerini devre dışı bırakmaz (zor olanı değil, genelde yükseltmekte özgürsünüz).
Stéphane Chazelas

@ StéphaneChazelas Kullanıcı etkileşimlerini gerçekleştiren bir programda, SIGINT'in genel semantiği, mevcut kullanıcı komutunu iptal etmek ve kullanıcının programla etkileşime girmesini sağlamak, yani ana komut döngüsüne geri dönmektir. Öte yandan, SIGQUIT'in istifa etmediği bir program gördüğümü hatırlamıyorum (sinyal işleyicideki hataları engeller). Gerçekten de birçok sistemin çekirdek dökümlerini varsayılan olarak devre dışı bırakmasının yolu, çekirdek döküm boyutu yumuşak sınırını 0'a ayarlamaktır.
Gilles 'SO- kötülük yapmayı bırak'

İstisna bu. SIGINT şu anda çalışan görevi öldürür. Sadece birkaç uygulama kendi “ön plan” görevini öldürmek için genişletirdi. lessYa da düşünüyor olmalısın vim. O Not cmd | less, CTRL-Cgenellikle öldürür cmd(için ise lesso) bir arama gibi geçerli eylemi (iptal etmek işlenir oldu) (devam)
Stéphane Chazelas

Cevabınızın ifadesini bu konuda kafa karıştırıcı buluyorum. SIGQUIT'in genel olarak kullanılmaması, aynı şekilde kullanılmamasıdır. Şu anda yaptığınız işlemi iptal etmek için CTRL-C tuşlarına basın. CTRL- \ `yı sadece arada sırada çekirdek dökümü oluşturmak için hata ayıklamak için kullanırsınız. Genelde bir uygulamanın bunu yapmaya çalışırken yol almak istemesinin bir nedeni yoktur.
Stéphane Chazelas

@ StéphaneChazelas Sadece daha az ve vim, kullanıcı komutlarını okuyan çoğu terminal tabanlı uygulama. Örneğin REPL (bash, çizgi, ksh, zsh, python, irb, fsharpi, Mathematica,…). Çok nadir görülür. İlk yorumunuz SIGINT ve SIGQUIT'i çok farklı boyamaya, son yorumunuz ise SIGINT ve SIGQUIT'i çok fazla boyamaya itiraz ediyor, bu da beni sürdüğünüz şey konusunda şaşkınlaştırıyor.
Gilles 'SO- kötü olmayı'

7

Gilles answer'a ek olarak şunu da ekleyeyim, bash içerisinde yazdırılamayan karakterleri her zaman Ctrl-v+ key( Ctrl-v+ Ctrl+4) ile bash olarak girebilir ve karakter kodunu ile kontrol edebilirsiniz.

$ printf '^\' | od -An -tu    # input ^\ as C-v C-4
28

Karakterin ondalık kodunu, kontrol edebileceğiniz gibi man ascii, dosya ayırıcısına (FS) karşılık gelir .


Peki ctrl + v ne yapar? Buna "pano yapıştır" olarak alışkınım.
JDługosz

2
@ JDługosz: Ctrl-V terminal anlatır olup aşağıdaki karakter yorumlar. GUI tuş kombinasyonlarının bu kontrol karakterlerini devralması ve gereksiz karışıklığa neden olması talihsiz bir gerçektir. Linux, GUI tuşları için Alt- [Key] kullanmıştı (örn. Kopyala / yapıştır için Alt-C / Alt / V), ama sonra insanlar Windows’la aynı şeyi yapmanın daha önemli olduğunu düşünüyorlardı; Bu arada Mac kullanıcıları, bu işlemler için Ctrl tuşu yerine Komut tuşunu kullanmakta hala bir problem yaşamadılar.
celtschk

(Kısa) komut şöyledir: printf '%d\n' '"^\'?
Isaac,
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.