İken Thomas Dickey'nin cevabı oldukça doğrudur, Stéphane Chazelas doğru dönüşüm dokunulmaz olmadığını Dickey'nin cevabı Bir yorumda; hat disiplininin bir parçasıdır.
Aslında çeviri tamamen programlanabilir.
Adam 3 termios adam sayfası temelde tüm ilgili bilgileri içerir. (Bağlantı, hangi özelliklerin yalnızca Linux'ta olduğunu ve POSIX veya diğer sistemlerde ortak olan Linux man- page projesini alır ; her zaman oradaki her sayfadaki Uygunluk bölümünü kontrol edin .)
iflag
(Terminal nitelikler old_settings[0]
söz konusu gösterilen kod Python ) Tüm POSIXy sistemlerinde üç alakalı bayrakları vardır:
INLCR
: Ayarlanmışsa, NL'yi girişte CR'ye çevirin
ICRNL
: Ayarlanmışsa (ve IGNCR
ayarlanmadıysa), girişte CR'yi NL'ye çevirin
IGNCR
: Girişte CR'yi yoksay
Benzer şekilde, ilgili çıktı ayarları ( old_settings[1]
) da vardır:
OPOST
: Çıktı işlemeyi etkinleştir.
OCRNL
: Çıktıda CR'yi NL ile eşleştirin.
ONLCR
: NL'yi çıktıda CR ile eşleştirin. (XSI; tüm POSIX veya Single-Unix-Specification sistemlerinde mevcut değildir.)
ONOCR
: İlk sütundaki CR'yi atlayın (çıktı vermeyin).
ONLRET
: Atla (çıkış yok) CR.
Örneğin, tty
modüle güvenmekten kaçınabilirsiniz . "Makeraw" işlemi sadece bir takım bayrakları temizler (ve oflag'ı ayarlar CS8
):
import sys
import termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
ch = None
try:
new_settings = termios.tcgetattr(fd)
new_settings[0] = new_settings[0] & ~termios.IGNBRK
new_settings[0] = new_settings[0] & ~termios.BRKINT
new_settings[0] = new_settings[0] & ~termios.PARMRK
new_settings[0] = new_settings[0] & ~termios.ISTRIP
new_settings[0] = new_settings[0] & ~termios.INLCR
new_settings[0] = new_settings[0] & ~termios.IGNCR
new_settings[0] = new_settings[0] & ~termios.ICRNL
new_settings[0] = new_settings[0] & ~termios.IXON
new_settings[1] = new_settings[1] & ~termios.OPOST
new_settings[2] = new_settings[2] & ~termios.CSIZE
new_settings[2] = new_settings[2] | termios.CS8
new_settings[2] = new_settings[2] & ~termios.PARENB
new_settings[3] = new_settings[3] & ~termios.ECHO
new_settings[3] = new_settings[3] & ~termios.ECHONL
new_settings[3] = new_settings[3] & ~termios.ICANON
new_settings[3] = new_settings[3] & ~termios.ISIG
new_settings[3] = new_settings[3] & ~termios.IEXTEN
termios.tcsetattr(fd, termios.TCSANOW, new_settings)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
uyumluluk uğruna, öncelikle tüm bu sabitlerin termios modülünde olup olmadığını kontrol etmek isteyebilirsiniz (POSIX olmayan sistemlerde çalıştırıyorsanız). Ayrıca kullanabilirsiniz new_settings[6][termios.VMIN]
ve new_settings[6][termios.VTIME]
orada hiçbir bekleyen bir veridir ve ne kadar süre (deciseconds tamsayı sayısında) eğer sete salt bloke edip. (Tipik VMIN
olarak 0'a ve VTIME
okumaların hemen dönmesi gerekiyorsa veya okumanın en fazla ne kadar bekleyeceği pozitif bir sayıya (saniye onda) ayarlanır .)
Gördüğünüz gibi, yukarıdaki (ve genel olarak "makeraw") girişteki tüm çeviriyi devre dışı bırakır, bu da kedinin gördüğü davranışı açıklar:
new_settings[0] = new_settings[0] & ~termios.INLCR
new_settings[0] = new_settings[0] & ~termios.ICRNL
new_settings[0] = new_settings[0] & ~termios.IGNCR
Normal davranışlar elde etmek için, bu üç satırı temizleyen satırları atlamanız yeterlidir ve "ham" olduğunda bile giriş çevirisi değişmez.
new_settings[1] = new_settings[1] & ~termios.OPOST
Hat tüm çıkış işleme devre dışı bırakır, başka çıkış bayrakları demek ne olursa olsun. Çıktı işlemeyi sağlam tutmak için atlayabilirsiniz. Bu ham modda bile çıkışı "normal" tutar. (Girişin otomatik olarak yankılanıp ECHO
yanılmadığını etkilemez; bu cflag tarafından kontrol edilir new_settings[3]
.)
Son olarak, yeni özellikler ayarlandığında, yeni ayarlardan herhangi biri yapılmışsa çağrı başarılı olur . Ayarlar hassassa (örneğin, komut satırında bir şifre istiyorsanız), yeni ayarları almalı ve emin olmak için önemli bayrakların doğru ayarlandığını / ayarlandığını doğrulamalısınız.
Mevcut terminal ayarlarınızı görmek istiyorsanız,
stty -a
Giriş bayrakları genellikle dördüncü satırda ve çıkış bayrakları beşinci satırda, -
bayrak ayarlanmamışsa bayrak adından önce gelir. Örneğin, çıktı
speed 38400 baud; rows 58; columns 205; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
Psödoterminallerde ve USB TTY cihazlarında, baud hızı önemsizdir.
Parolaları okumak isteyen Bash komut dosyaları yazarsanız, aşağıdaki deyimi göz önünde bulundurun:
#!/bin/bash
trap 'stty sane ; stty '"$(stty -g)" EXIT
stty -echo -echonl -imaxbel -isig -icanon min 1 time 0
EXIT
Kabuk çıkan her tuzak yürütülür. stty -g
Geçerli ayarlar zaman komut dosyası çıkışlar, otomatik olarak geri yüklenir böylece, yazılı kaydın başlangıcında terminali geçerli ayarlarını okur. Senaryoyu Ctrl+ ile kesebilirsin Cve doğru olanı yapar. (Sinyallerle bazı köşe durumlarda, ben terminali bazen yazmak için birini gerektiren ham / kuralsız ayarlarla (tıkıldım aldığını tespit ettik reset
+ Enter) terminali de körlemesine, ama motor stty sane
gerçek orijinal ayarları geri yüklemeden önce her zaman için bunu ortadan kaldırıncaya Bu yüzden orada, bir çeşit ek güvenlik.)
read
Dahili bash kullanarak giriş satırlarını (terminale bağlı olmayan) okuyabilir, hatta giriş karakterlerini karakter bazında okuyabilirsiniz
IFS=$'\0'
input=""
while read -N 1 c ; do
[[ "$c" == "" || "$c" == $'\n' || "$c" == $'\r' ]] && break
input="$input$c"
done
IFS
ASCII NUL olarak ayarlamazsanız , read
yerleşik ayırıcılar tüketir, böylece bu c
boş olur. Genç oyuncular için tuzak.