Terminálkezelés
E pontban elsősorban azokkal a problémákkal foglalkozunk, amik a terminálok használatakor léphetnek fel. Általában két eset fordul elő: vagy már a bejelentkezéskor problámák vannak, mert rossz a terminálbeállítás, vagy pedig menetközben állítódik el (például bináris fájl listázása egészen kiválóan alkalmas e célra...). Az első esetben konfigurációs fájljainkban (.login, .cshrc, .profile) kell a megfelelő beállításokról gondoskodnunk, utóbbi esetben viszont parancssorból kell kiadni a megfelelő parancsokat, gyakran "vakrepülésben", minden visszajelzés nélkül.
Elsőként az stty paranccsal ismerkedjünk meg, ami a terminálbeállítások minden szintjét vezérli, s ismerete valamilyen szinten mindenképpen ajánlatos (bár nem túl élvezetes) a felhasználónak, hacsak nincs állandóan a közelben gyakorlott segítség vagy rendszergazda.
Az stty parancs neve a "set teletype" rövidítésből ered, s már maga a név is nemes patinát és időtlenséget érzékeltet, hiszen hol vannak ma már a teletype-ok? A név mindenesetre megmaradt, s vele a múltból örökölt opciók és beállítási lehetőségek tömege is.
Az stty parancs két parancssori opcióval hívható meg: a -a opció hatására az összes beállítást kilistázza, nem csak a legfontosabbakat, a -g opció hatására pedig olyan formátumban történik a kiíratás, hogy egy másik stty parancs bemenetként tudja azt használni.
A parancssorban szereplő összes többi argumentum már a konkrét stty beállításokhoz tartozik, ezeket funkcióik szerint több csoportba osztjuk. Megadásuk némiképp eltér a UNIX opciók többségétől, ugyanis e paraméterek többsége alternáló kapcsolóként üzemel, egy-egy jellemző terminálfunkciót be-, illetve kikapcsol. A func funkció bekapcsolt (engedélyezett) állapotát az
stty
funcparanccsal érhetjük el, míg a kikapcsolást (letiltást) a
stty -
funcparanccsal. Néhány paraméterhez másik paraméter is tartozik, ami a tényleges értéket hordozza, például
stty kill ^u
a kill funkcióhoz (teljes sor törlése) a CTRL-U karaktert rendeli.
A fenti szabályok szerint viselkedő opciók az alábbi ismertetőkben a (-)func, illetve a func (-func) jelölésekkel szerepelnek.
Az stty listáiban a vezérlőkarakterek a ^c megadással szerepelnek; beíráskor implementációfüggően vagy ugyanígy adhatunk meg egy vezérlőkaraktert, vagy egy backslash karaktert írunk eléje, hogy elnyomjuk esetleges speciális jelentését. A DEL billentyűt a ^?, míg az üres, értékkel nem bíró beállítást a "^'" karakterek szokták jelezni.
Az stty által szabályzott funkciók az alábbi nagy csoportokba oszthatóak: kontroll beállítások (control modes), input beállítások (input modes), output beállítások (output modes), lokális beállítások (local modes), vezérlőkarakter beállítások (control assignments) és kombinált beállítások (combination modes). Implementációtól függően más csoportok is lehetségesek, s persze platformonként más és más plusz szolgáltatások is lehetségesek, éppen ezért csak a mindenhol megtalálható, szabványosodott beállításokkal foglalkozunk.
Ebbe a csoportba tartoznak az általános vonali jellemzőket, sebességet, paritást, flow-controlt szabályzó paraméterek.
(-)parenb
Paritásbit beállítása és észlelése.(-)parodd
Engedélyezése esetén páros, letiltása esetén páratlan paritást alkalmaz.(-)parext
Kiterjesztett paritásvizsgálatot engedélyez (mark és space parity).cs5
, cs6, cs7, cs8Beállítja a megfelelő karakterméretet. (Magyar ékezetes megjelenítéshez értelemszerűen a cs8 beállítás szükséges.)
110
, 300, 600, 1200, 2400, 4800, 9600, 19200, 38400A vonali sebesség beállítása az adott értékre (baud-ban mérve). (Néha külön ispeed n és ospeed n opciókkal lehet állítani a be- és kiviteli sebességet.)
(-)hupcl
Modemes kapcsolat esetén kilépéskor bontja a vonalat.(-)cstopb
Engedélyezés esetén 2, letiltás esetén 1 stopbitet használ karakterenként.E csoportba tartoznak többek között a beírt karakterek értelmezését és leképzését vezérlő opciók.
(-)ignbrk
Figyelmen kívül hagyja a bemenetről érkező break karaktert (a break egy speciális hosszúságú vezérlőkarakter, többek között a vonali sebesség automatikus felismerésére és váltására használják).(-)ignpar
Figyelmen kívül hagyja a paritáshibákat.(-)istrip
Engedélyezése esetén 7 bitesre vágja le a vett karaktereket. (Magyar ékezetes szöveg esetén ezért mindig le kell tiltani ezt az opciót.)(-)inlcr
A beolvasott újsor (NL) karaktert kocsi-vissza (RETURN) karakterré képezi le.(-)igncr
A beolvasott RETURN karaktert figyelmen kívül hagyja.(-)icrnl
A beolvasott kocsi-vissza (RETURN) karaktert újsor karakterré (LF) képezi le.(-)iuclc
A beolvasott nagybetűket kisbetűkké képezi le.(-)ixon
A START/STOP kimenet vezérlési (ún. handshake protokoll) használatát engedélyezi. (A kiíratás leállítható a STOP vezérlőkarakterrel, a START vezérlőkarakter vételekor pedig folytatható.) (lásd a vezérlőkarakter beállításoknál).(-)ixany
Bármely karakter hatására folytatódik a kivitel, nem csak a START vezérlőkarakterre.(-)ixoff
A bemeneti puffer majdnem üres/majdnem teli állapotában START illetve STOP vezérlőkarakterek küldését várja.(-)opost
Továbbfeldolgozás: a kimenet további feldolgozása az alábbi opciók szerint engedélyezett, letiltás esetén további feldolgozás nélkül küldi ki a karaktereket.(-)olcuc
Kisbetűket nagybetűvé konvertálja a kimeneten.(-)onlcr
Az újsor (LF) karaktert kocsi-vissza-soremelés (RETURN-LF) karakterpárrá képezi le a kimeneten.(-)ocrnl
A kocsi-visszát (RETURN) újsorrá (NL) képezi le a kimeneten.(-)onocr
Az első oszlopban lévő kurzor esetén nem küldi el kocsi-visszát (RETURN) a kimenetre.(-)onlret
Az újsor (NL) karakter hatására kocsi-vissza (RETURN) funkciót hajt végre.(-)isig
Leellenőrzi, hogy a beolvasott karakterek nem speciális vezérlőkarakterek-e (intr, quit, swtch).(-)icanon
Engedélyezi az úgynevezett kanonikus inputot (találóbban talán soreditálásnak nevezhetnénk); ilyenkor az erase és kill karaktereket a kocsi-vissza karakter beérkezése előtt feldolgozza.(-)xcase
Kis/nagybetűs megjelenítés értelmezése.(-)echo
Visszaír a képernyőre minden begépelt karaktert.(-)echoe
A beütött erase karaktert backspace-szóköz-backspace karaktersorozatként írja vissza. (CRT terminálokon ennek hatására a törölni kívánt karakter valóban törlődik, bár speciális karakterek, tabulátorok esetén összezavarodhat a megjelenítés.)(-)echok
A kill karakter után újsor (NL) karaktert is kiír.(-)echonl
Visszaírja a képernyőre az újsor (NL) karaktert is.(-)echoctl
A vezérlőkaraktereket ^c formában jeleníti meg.control-char c A control-char funkcióhoz a c karaktert rendeli. A legelterjedtebb vezérlőfunkciók az alábbiak:
eof Fájlvége, illetve bevitel végének jelzése. Rendszerint CTRL-D.
erase A kurzor feletti karaktert törli. Rendszerint a DEL, a RUBOUT, illetve a BS billentyűk valamelyike, hagyományosan a # karakter.
intr Program futásának megszakítása. Rendszerint a CTRL-C, időnként a DEL karakter.
kill Teljes addig begépelt sor eldobása. Rendszerint a CTRL-U, hagyományosan a @ karakter.
start Adatkivitel (például képernyőlistázás) újraindítása. Rendszerint a CTRL-Q karakter.
stop Adatkivitel (például képernyőlistázás) leállítása. Rendszerint a CTRL-S karakter.
susp Folyamatok futásának felfüggesztése. Rendszerint a CTRL-Z karakter.
A kombinált módok, mint nevük is mutatja, egyfajta menü lehetőséget biztosítanak, jellemzően együtt előforduló opciók egyszerre történő beállításához. Néhány a gyakoribbak közül:
Név
beállításkombinációevenp
, parity parenb cs7
-evenp
, -parity -parenb cs8
oddp
parenb parodd cs7
-oddp
parenb parodd cs8
raw
(-raw, cooked) -opost -isig -icanon -xcase(Sormódú be- és kivitel: nincs kimeneti továbbfeldolgozás, az erase, kill, intr, quit, swtch és eot karaktereket se dolgozza fel.
nl
-icrnl -onlcr
-nl
-icrnl -onlcr _inlcr -igncr -ocrnl -onlret
sane
A terminálparamétereket nagyjából mindenhol hasz-Az "egységesített" UNIX-ok elterjedésével, azaz azoknál, ahol mind az SVR4, mind a BSD UNIX-ok parancsai megtalálhatóak, gyakran okoznak gondot azok a parancsok, amelyek mindkét verzióban szerepelnek, de eltérő hívási móddal, vagy működéssel. Az stty is ezek közé tartozik, s mert elég alapvető szerepet játszik, meg kell hogy emlékezzünk a két verzió legfontosabb eltéréseiről.
A legfontosabb különbség, hogy az SVR4 alapú stty esetében a vonalparaméterek állítását, illetve lekérdezését a standard inputként megadott periférián végzi, míg a BSD alapú stty ugyanezt a standard outputra hajtja végre. Ha tehát a /dev/tty23 nevű terminál vonali paramétereit állítjuk (mondjuk a karakterméretet szeretnénk a cs8 opcióra állítani), akkor SVR4 rendszer esetén az
stty cs8 </dev/tty23
parancsot kell kiadnunk, míg BSD UNIX esetén az
stty cs8 >/dev/tty23
a megfelelő beállító parancs.
További eltérés még a két verzió között, hogy a BSD változatnál néhány további opció is szokott szerepelni, többek közt parancssori opcióként a -h, aminek hatására jobban olvasható, oszlopos formátumban írja ki az opciókat és a vezérlőkarakter beállításokat.
Mint már említettük, terminálproblémákkal leginkább két esetben találkozhatunk: egyfelől belépéskor, ha nem megfelelően beállított paraméterekkel rendelkezik a terminálunk, másfelől ha menetközben állítódik el valamilyen paraméter. A rosszul beállított terminálparaméterek esetén a megoldás kulcsa inkább az illetékes rendszeradminisztrátor kezében van, ő tudja csak módosítani a terminálok alapvető vonali paramétereit, ugyanakkor a felhasználó is beállíthat konfigurációs fájljaiban stty paranccsal állítható paramétereket. A leginkább gyakori módosítások a vezérlőkarakterek hozzárendelésében, a paritásbitek kezelésében és a karakterméret beállításban lehetségesek; végül is próbálgatással is be lehet lőni a megfelelő állapotot, de mindenképpen célszerűbb a rendszergazda segítségét kérni.
Más eset, ha menetközben állítódott el a terminál, például egy bináris állomány kilistázásakor. Ilyenkor rendszerint "se kép se hang" állapot következik be, a terminál semmilyen billentyűre sem reagál, a képernyő pedig befagy. Az alábbiakban ismertetett módon általában visszaállítható a működőképes állapot, ha nem, akkor a képernyő ki-bekapcsolását is megkísérelhetjük (egyes rendszereken ez sajnálatos módon kilépteti a felhasználót).
Ha semmilyen billentyűre nem reagál a terminál, valószínűleg a sorlezáró újsor (RETURN) karaktert nem érzékeli a terminál. Próbálkozzunk azzal, hogy a parancsok lezárásakor nem az Enter (Return, stb jelzésű) gombot nyomjuk meg, hanem a CTRL-J, illetve a CTRL-M karaktert, majd pedig egymásután mindkettőt; ha a be- és kimeneti RETURN-LF leképezések romlottak el, a fenti karakterkombinációk valamelyikére reagálni fog.
Ha a bevitelt már érzékeli a terminál, az
stty -a
paranccsal írassuk ki az aktuális beállításokat. Ha semmit nem látunk, valószínűleg a képernyőre történő visszaírás (echo) opciók vannak letiltva. Adjuk ki az
stty echo echoe echok
parancsot, ennek hatására már kell hogy visszajelzést kapjunk.
Ha már a bevitelt is érzékeli a terminál és vissza is írja a begépelt karaktereket, akkor többé-kevésbé működőképes a dolog; ha kiadjuk az
stty sane
parancsot, a terminálparaméterek egy nagyjából mindenhol alkalmazható kombinációra állnak be, innen már "finomhangolással" lehet az eredeti állapotot visszaállítani.
A tput paranccsal egy terminál beállító paraméterei kérdezhetőek le, illetve küldhetőek ki az adott terminálnak. Egyes opcióival ezenkívül alapállapotba is helyezhető a terminál, s ez az a szolgáltatás, amire szükségünk lehet.
A tput parancs az alábbi formákban hívható:
tput [-T
type] capname [parms...]tput [-T
type] inittput [-T
type] resettput [-T
type] longnameA -Ttype megadás opcionális, a type nevű terminált, ennek hiányában a kurrens terminált használja a parancs (ennek neve a TERM shell-változóban található).
Az első megadási mód esetén a terminál adatbázisban szereplő megjelenítési funkciók értékét lehet lekérni. (A terminál adatbázis a gyakrabban használt terminálok jellemzőit tartalmazza. Az egyes funkciókhoz szabványos elnevezések (capname) tartoznak (például cup a kurzorpozicionálási funkció neve, clear a képernyőtörlésé stb), s minden ilyen funkciónál ott szerepel az a karaktersorozat, ami az adott terminálnál az adott funkciót végrehajtja.)
Mivel a lekért funkcióhoz tartozó vezérlőkaraktereket a tput a standard kimenetre (azaz a terminálra) listázza ki, ebből egyúttal az is következik, hogy ha a saját terminálunkra vonatkozó funkciókat kérdeztünk le a tput paranccsal, az adott funkciók azonnal végre is hajtódnak, hiszen a terminál a karaktersorozat megjelenítésekor neki szóló, általa értelmezhető vezérlőkaraktereket fog látni. Így például bármely típusú terminálon is jelentkeztünk be, a
tput clear
paranccsal törölhetjük a képernyőt.
A második és a harmadik megadási mód a terminál alapállapotba hozását, illetve inicializálását szolgálja: tput reset hatására az alapállapotba jutáshoz szükséges vezérlőszekvenciákat hajtja végre a terminál, tput init pedig a kezdeti inicializáló műveleteket hajtja végre. Ezek azok a parancsok, amiket használhatunk még megbokrosodott terminálunk helyrepofozására. Célszerű általában az stty beállítások korrigálása után kiadni őket.
A negyedik megadási mód az adott terminál nevét és alapvető jellemzőit írjaírja ki, a szokottnál részletesebb formában.