I'd wager probably more people today don't know what the TERM
environment variable really does than do (yes, everyone who used to
use ed over a 300-baud acoustic-coupler is laughing, but times have
changed!).
I recently got hit by what was, at the time, a strange bug.
Consider the following trivial Python program, that uses curses and
issues the "hide the cursor" command.
$ cat curses.py
import curses
curses.initscr()
curses.curs_set(0)
curses.nocbreak()
curses.echo()
curses.endwin()
If you run it in your xterm or linux console, nothing should
happen. But change your TERM to
vt102 and it won't work:
$ TERM=vt102 python ./test.py
Traceback (most recent call last):test-curses.py
File "./test-curses.py", line 5, in <module>
curses.curs_set(0)
_curses.error: curs_set() returned ERR
(obvious when you explicitly reset the term, no so obvious when
some script is doing it behind your back -- as I can attest!) So,
what really happened there? The
curs_set man page gives us
the first clue:
curs_set returns the previous cursor state, or ERR if the requested visibility is not supported.
How do we know if visibility is supported? For that, curses
consults the
terminfo library. This is a giant database
streching back to the dawn of time that says what certain terminals
are capable of, and how to get them to do whatever it is you want them
to do. So the
TERM environment variable tells the terminfo
libraries what database to use (see
/usr/share/terminfo/*)
when reporting features to people who ask, such as
ncurses.
man 5 terminfo tells us:
cursor_invisible civis vi make cursor invisible
So curses is asking terminfo how to make the cursor invisible, and
getting back "that's not possible here", and hence throwing our
error.
But how can a person tell if their current terminal supports this
feature?
infocmp will echo out the features and what escape
codes are used to access them. So we can check easily:
$ echo $TERM
xterm
$ infocmp grep civis
bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
$ TERM=vt102 infocmp grep civis
$
So we can now clearly see that the
vt102 terminal doesn't
support
civis, and hence has no way to make the cursor
invisible; hence the error code.
If you're ever looking for a good read, check out the
termcap/terminfo
master file. The comments are like a little slice of the history
of computing!