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.