Terminal

A terminal is a display unit that is part of the user interface to a computer system. The word carries the connotation of being text-only.

See Also

ANSI
Various ANSI standards govern terminal behaviour.
xterm
A terminal emulator.
curses
A C library for controlling terminals.
handling of ANSI terminals using Expect
pty
Short for pseudo teletype, but commonly referred to as pseudo terminal
stty
The *nix command to configure and manage a terminal.
terminal control sequence

Reference

VT100.net
Dedicated to the range of video terminals produced by Digital Equipment Corporation (DEC) from 1970 to 1995. The most famous of these is the VT100.
The TTY demystified , Linus Åkesson, 2008-07-25

Description

Terminal emulators for Linux have support for ANSI escape codes built in.

Checking for a Terminal

chan configure can be used to determine whether a channel is connected to a terminal:

proc isatty chan {
    expr {[catch {chan configure $chan -mode}] == 0}
}

Credit to [L1 ] for the idea.

However, this doesn't work on Windows.

AMG: To check if stdin is connected to a terminal, run:

if {![catch {exec /usr/bin/tty -s}]} {
    # stdin is a terminal
}

Checking for stdout/stderr is harder because exec does not allow stdout/stderr to be redirected to stdin because stdout/stderr are not considered readable. Instead, let the shell do the redirection. Furthermore, instruct [exec] to not intercept stdout/stderr.

if {![catch {exec /bin/sh -c {/usr/bin/tty -s < /dev/stdout} >@ stdout}]} {
    # stdout is a terminal
}
if {![catch {exec /bin/sh -c {/usr/bin/tty -s < /dev/stderr} 2>@ stderr}]} {
    # stderr is a terminal
}

Without the -s switch, the tty program not only checks if its stdin is a terminal, but it also prints the device name to its stdout, e.g. /dev/pts/0.


MHo 2021-09-17: How to test this on Windows? I found the following way if twapi is available:

package require twapi
twapi::import_commands
proc isStdinRedirected {} {
     catch {get_tcl_channel_handle stdin write}
}
puts [isStdinRedirected]

Examples:

c:\Users\matthiasu\usr\pgm\tcl\usr\Tst\isatty>echo test|tclkitsh test8.tcl
1

c:\Users\matthiasu\usr\pgm\tcl\usr\Tst\isatty>tclkitsh test8.tcl<nul
1

c:\Users\matthiasu\usr\pgm\tcl\usr\Tst\isatty>tclkitsh test8.tcl
0

Tcl internally uses isatty(). Perhaps it could provide the following command:

chan isatty ...

Page Authors

amg
Provided the example of chan configure to check for a terminal.
pyk