инициализировать терминал или запросить базу данных terminfo (initialize a terminal or query terminfo database)
Портативность (Portability)
This implementation of tput
differs from AT&T tput
in two
important areas:
• @TPUT@
capname writes to the standard output. That need not
be a regular terminal. However, the subcommands which
manipulate terminal modes may not use the standard output.
The AT&T implementation's init
and reset
commands use the BSD
(4.1c) tset
source, which manipulates terminal modes. It
successively tries standard output, standard error, standard
input before falling back to '/dev/tty' and finally just
assumes a 1200Bd terminal. When updating terminal modes, it
ignores errors.
Until changes made after ncurses 6.0, @TPUT@
did not modify
terminal modes. @TPUT@
now uses a similar scheme, using
functions shared with @TSET@
(and ultimately based on the
4.4BSD tset
). If it is not able to open a terminal, e.g.,
when running in cron
, @TPUT@
will return an error.
• AT&T tput
guesses the type of its capname operands by seeing
if all of the characters are numeric, or not.
Most implementations which provide support for capname
operands use the tparm function to expand parameters in it.
That function expects a mixture of numeric and string
parameters, requiring @TPUT@
to know which type to use.
This implementation uses a table to determine the parameter
types for the standard capname operands, and an internal
library function to analyze nonstandard capname operands.
This implementation (unlike others) can accept both termcap and
terminfo names for the capname feature, if termcap support is
compiled in. However, the predefined termcap and terminfo names
have two ambiguities in this case (and the terminfo name is
assumed):
• The termcap name dl
corresponds to the terminfo name dl1
(delete one line).
The terminfo name dl
corresponds to the termcap name DL
(delete a given number of lines).
• The termcap name ed
corresponds to the terminfo name rmdc
(end delete mode).
The terminfo name ed
corresponds to the termcap name cd
(clear to end of screen).
The longname
and -S
options, and the parameter-substitution
features used in the cup
example, were not supported in BSD
curses before 4.3reno (1989) or in AT&T/USL curses before SVr4
(1988).
IEEE Std 1003.1/The Open Group Base Specifications Issue 7
(POSIX.1-2008) documents only the operands for clear
, init
and
reset
. There are a few interesting observations to make
regarding that:
• In this implementation, clear
is part of the capname support.
The others (init
and longname
) do not correspond to terminal
capabilities.
• Other implementations of tput
on SVr4-based systems such as
Solaris, IRIX64 and HPUX as well as others such as AIX and
Tru64 provide support for capname operands.
• A few platforms such as FreeBSD recognize termcap names
rather than terminfo capability names in their respective
tput
commands. Since 2010, NetBSD's tput
uses terminfo
names. Before that, it (like FreeBSD) recognized termcap
names.
Beginning in 2021, FreeBSD uses the ncurses tput
, configured
for both terminfo (tested first) and termcap (as a fallback).
Because (apparently) all of the certified Unix systems support
the full set of capability names, the reasoning for documenting
only a few may not be apparent.
• X/Open Curses Issue 7 documents tput
differently, with
capname and the other features used in this implementation.
• That is, there are two standards for tput
: POSIX (a subset)
and X/Open Curses (the full implementation). POSIX documents
a subset to avoid the complication of including X/Open Curses
and the terminal capabilities database.
• While it is certainly possible to write a tput
program
without using curses, none of the systems which have a curses
implementation provide a tput
utility which does not provide
the capname feature.
X/Open Curses Issue 7 (2009) is the first version to document
utilities. However that part of X/Open Curses does not follow
existing practice (i.e., Unix features documented in SVID 3):
• It assigns exit code 4 to 'invalid operand', which may be the
same as unknown capability. For instance, the source code
for Solaris' xcurses uses the term 'invalid' in this case.
• It assigns exit code 255 to a numeric variable that is not
specified in the terminfo database. That likely is a
documentation error, confusing the -1
written to the standard
output for an absent or cancelled numeric value versus an
(unsigned) exit code.
The various Unix systems (AIX, HPUX, Solaris) use the same exit-
codes as ncurses.
NetBSD curses documents different exit codes which do not
correspond to either ncurses or X/Open.