Tuşuna bastığınızda Ctrl+X, terminal öykünücünüz bayt 0x18'i sahte terminal çiftinin ana tarafına yazar.
Bundan sonra ne olacağı, tty hattı disiplininin (çekirdeğin ana tarafı (öykünücünün kontrolü altında) ile slave tarafı (terminalde çalışan uygulamaların etkileşime girdiği) arasında yer alan bir yazılım modülü) nasıl yapılandırıldığına bağlıdır.
Bu yapılandırmak için bir komut tty satırı disiplin olan stty
komut.
Bunun gibi aptal bir uygulamayı çalıştırırken cat
, stdin'in bir terminal olup olmadığının farkında değildir ve terminal, tty hattı disiplininin ham bir hat editörü uyguladığı varsayılan bir kanonik moddadır .
Bu ham satır düzenleyiciden daha fazlasına ihtiyaç duyan bazı etkileşimli uygulamalar , başlangıçta bu ayarları değiştirir ve ayrılırken geri yükler. Modern mermiler, anında bu tür uygulamalara örnektir. Kendi daha gelişmiş çizgi editörlerini uygularlar.
Tipik olarak, bir komut satırı girerken, kabuk tty satır disiplinini bu moda sokar ve geçerli komutu çalıştırmak için enter tuşuna bastığınızda, kabuk normal tty modunu geri yükler (istemi vermeden önce yürürlükte olduğu gibi).
stty -a
Komutu çalıştırırsanız , aptal uygulamalar için geçerli ayarları görürsünüz . Sen görmek olasıdır icanon
, echo
ve echoctl
ayarları etkinleştirilen.
Bunun anlamı şudur:
icanon
: bu ham hat düzenleyici etkin.
echo
: yazdığınız karakterler (terminal öykünücüsünün ana yüzeye yazdığı) geri yankılanır (terminal öykünücüsü tarafından okunabilir).
echoctl
: Yerine olmanın yankılandı asis, kontrol karakterleri olan yankılandı olarak ^X
.
Diyelim ki yazıyorsunuz A B Backspace-aka-Ctrl+H/? C Ctrl+X Backspace Return.
Terminal emülatörü gönderecektir: AB\bC\x18\b\r
. Hat disiplin olacaktır echo geri: AB\b \bC^X\b \b\b \b\r\n
ve köle tarafında giriş okur bir uygulama ( /dev/pts/x
) okuyacaktır AC\n
.
Uygulamanın gördüğü AC\n
tek şey ve sadece bastığınızda, orada Enterçıktı üzerinde herhangi bir kontrolü olamaz ^X
.
Eko için ilk ^H
( ^?
bazı terminallerde, erase
ayara bakın ) \b \b
terminale geri gönderildiğini fark edeceksiniz . Bu ikinci olurken, yine, hareket imleç, imleç geri çekmeme boşlukla üzerine yazmak dizisi var ^H
sonuçlandı \b \b\b \b
bu iki silmek ^
ve X
karakterleri.
^X
(0x18) kendisi tercüme ediliyordu ^
ve X
çıkış için. Gibi B
biz Backspace ile silinmiş olarak, bunun, uygulamaya yapmamıştır.
\r
(aka ^M
) yankı için ( ) ve başvuru için \r\n
( ) olarak çevrilmiştir .^M^J
\n
^J
Peki, bu aptal uygulamalar için seçeneklerimiz neler :
- devre dışı bırak
echo
( stty -echo
). Bu, kontrol karakterlerinin yankılanma şeklini etkili bir şekilde değiştirir, hiçbir şey yankılanmadan. Gerçekten bir çözüm değil.
- devre dışı bırak
echoctl
. Yani (dışındaki yolu kontrol karakterleri değiştirir ^H
, ^M
yankılandı edilir ... çizgi editörü tarafından kullanılan ve diğer tüm olanları). Daha sonra olduğu gibi yankılanırlar . Yani, ESC karakteri \e
( ^[
/ 0x1b
) bayt (terminal tarafından bir kaçış dizisinin başlangıcı olarak kabul edilir) olarak ^G
gönderilir, bir \a
(BEL, terminalinizi bip sesi çıkarır) gönderirsiniz ... Seçenek değil .
- ham çizgi düzenleyiciyi devre dışı bırak (
stty -icanon
). Ham uygulamalar çok daha az kullanılabilir hale geleceğinden gerçekten bir seçenek değil.
- tty line disiplininin davranışını değiştirmek için çekirdek kodunu düzenleyin, böylece bir kontrol karakterinin yankısı
\e[7m^X\e[m
sadece yerine gönderilir ^X
(burada \e[7m
çoğu terminalde genellikle ters videoyu etkinleştirir).
Bir seçenek rlwrap
, aptal uygulamalara süslü bir çizgi editörü eklemek için kirli bir hack gibi bir sarmalayıcı kullanmak olabilir . Bu sargı read()
, terminal aygıtından readline satır düzenleyicisine (tty line disiplini modunu değiştiren) basit çağrıları değiştirmeye çalışır .
Daha da ileri giderek, GNU ekranının özelliğine dayanarak zsh'ın hat düzenleyicisini ( ters videoda vurgulamak için) gerçekleşen terminalden gelen tüm girişleri ele geçiren böyle bir çözümü bile deneyebilirsiniz .^X
:exec
Şimdi kendi çizgi editörlerini uygulayan uygulamalar için yankının nasıl yapıldığına karar vermek onlara kalmış . bash
kontrol karakterlerinin nasıl yankılanacağını özelleştirmek için herhangi bir desteği olmayan readline kullanır.
İçin zsh
, bkz:
info --index-search='highlighting, special characters' zsh
zsh
yazdırılamayan karakterleri varsayılan olarak vurgular. Vurgulamayı örneğin ile özelleştirebilirsiniz:
zle_highlight=(special:fg=white,bg=red)
Bu özel karakterler için kırmızı üzerine beyaz vurgulama.
Ancak bu karakterlerin metin gösterimi özelleştirilemez.
UTF-8 yerelinde, 0x18 olarak görüntülenecek ^X
, \u378
, \U7fffffff
olarak (iki atanmamış Evrenkodlu noktaları) <0378>
, <7FFFFFFF>
, \u200b
(a not-gerçekten yazdırılabilir unicode karakter) <200B>
.
\x80
bir iso8859-1'de yerel olarak ^�
... vb.
bash
bureadline
şeyleri idare ediyor ve diğerlerinin çoğu için tty sürücüsü.