tty

Urządzenie terminalowe; historycznie dalekopis, w Linuksie tekstowa konsola lub wirtualny terminal. Nazwa pochodzi od dawnych maszyn dalekopisowych.

tty (skrót od teletypewriter, czyli dalekopis) to w świecie uniksowym nazwa urządzenia terminalowego — interfejsu znakowego, przez który człowiek rozmawia z systemem. Dziś nie podłączasz już fizycznego dalekopisu telegraficznego, więc w Linuksie tty oznacza zwykle wirtualny terminal: tekstową konsolę na maszynie albo okno terminala (tak naprawdę pseudoterminal) w środowisku graficznym. Nazwa została z lat 60., kiedy do komputera podpinało się prawdziwą maszynę dalekopisową stukającą znaki na papierze.

Jak to działa

Dla systemu tty to po prostu plik urządzenia w katalogu /dev. Klasyczne konsole tekstowe (te, które dostajesz po wciśnięciu Ctrl+Alt+F1 do F6) to /dev/tty1, /dev/tty2 i tak dalej. Kiedy otwierasz terminal w trybie graficznym albo łączysz się przez SSH, dostajesz pseudoterminal (pty) — parę urządzeń master/slave widoczną jako /dev/pts/0, /dev/pts/1 itd. Master to strona programu (emulatora terminala, demona SSH), slave to strona twojej powłoki.

To urządzenie odpowiada za rzeczy, których zwykle nie zauważasz: buforowanie linii, echo wpisywanych znaków, tłumaczenie Ctrl+C na sygnał przerwania czy obsługę Ctrl+D jako końca wejścia. Tym wszystkim steruje sterownik linii (line discipline) wewnątrz jądra.

Przykład z praktyki

Wpisz w terminalu polecenie tty — pokaże ścieżkę aktualnego urządzenia, np. /dev/pts/3. To bywa zaskakująco przydatne: możesz wysłać tekst do innego okna terminala, jeśli znasz jego tty:

  • tty — sprawdź, na którym terminalu siedzisz,
  • who — zobacz, kto jest zalogowany i na jakich tty,
  • echo "hej" > /dev/pts/3 — wyślij tekst na konkretny terminal.

Inny typowy scenariusz: skrypt cron albo proces w tle nie ma przypisanego terminala. Polecenie tty zwróci wtedy not a tty, a flaga -s (tryb cichy) pozwala to sprawdzić w skrypcie i zachować się inaczej, gdy nikt nie patrzy.

Częste pułapki

Pierwszy mit: że terminal i tty to dokładnie to samo. tty to urządzenie w jądrze, a emulator terminala (GNOME Terminal, xterm, Alacritty) to program, który po prostu rozmawia z pseudoterminalem. Drugi częsty błąd: programy zachowują się inaczej w zależności od tego, czy ich wyjście trafia na tty, czy do pliku albo potoku. Dlatego ls koloruje wynik na terminalu, ale traci kolory po przekierowaniu — wykrywa to przez isatty(). Jeśli kolory są ci potrzebne mimo wszystko, szukaj opcji typu --color=always.

Pojęcia powiązane: pty (pseudoterminal), shell, stdin/stdout/stderr, getty, sygnały i SIGINT, zmienna TERM, screen i tmux.