On Wed, Jun 17, 2020 at 09:30:25PM +0000, bry...@giraffe-data.com wrote:
>   With TERM environment variable set to an undefined terminal type, Bash
>   echoes a backspace as a space; I expect it to echo as a backspace (ctl-h).
>   It edits the line properly; it just isn't displayed correctly.
>   
>   Other line editing functions have the same problem.
>   
>   Setting TERM from the Bash prompt (to anything) puts things back to normal.

As Dennis says, there's a lot more involved here than just the TERM
variable.

The byte that's sent when you press the Backspace key is defined by
the terminal's hardware (if it's a physical terminal) or by its
configuration settings (if it's a terminal emulator).  Most terminals
send either the BS byte (0x08) or the DEL byte (0x7f).

On the host side, the system's terminal driver has a configuration
setting for what it *thinks* the terminal's Backspace byte is going
to be.  This is controlled at the shell level with the stty(1) command's
"erase" attribute.  So, either:

stty erase ^h    # or
stty erase ^?

Applications that rely on "canonical mode" terminal editing will allow
the terminal driver to handle Backspace according to whatever is in
the driver's configuration.  If this matches the terminal's output byte,
all is well.  If it doesn't, then Backspace won't work.

Bash (readline) does not rely strictly on canonical mode.  In bash,
both BS and DEL are treated as Backspace.  So, it's easy to think that
everything is fine if you only test Backspace within bash.  But programs
that you run *from* bash won't necessarily be OK.

Next, bash (readline) has a few different ways it can handle the
display of characters on the terminal during interactive editing.  It
chooses a strategy based on the TERM variable.  If TERM is set to
something sensible, like xterm or vt220 or linux, bash will make use
of the terminal's ability to position the cursor and erase partial
lines.

However, if TERM is set to something unrecognizable, bash will have
to fall back to more primitive methods.  The most obvious example is
when you type a command that goes beyond the right edge of the
terminal.  Normally, bash will scroll the terminal up one line (if
necessary), and continue displaying input on the next line, allowing
you to see both lines at the same time.  But in what I'll call "dumb
terminal mode", this doesn't happen.  Instead, the current line is
fully erased and redrawn, displaying only the ending part of the input.
You won't be able to see the whole input line all at once.  (This is
also ksh behavior.)

The short answer is "don't set TERM incorrectly".

The longer answer is, if you think you've discovered a bug in readline's
terminal handling, be ultra precise in how you report it.  First of all,
make sure what you're seeing is not the expected behavior for a
reduced-capability environment.  If you still think it's wrong, give
*exact* instructions for how to reproduce it.  Exactly what operating
system, terminal or terminal emulator, terminal configuration if
applicable, stty -a output, content of TERM, possibly the OS's terminfo
or termcap entry for that TERM variable, the *exact sequence of keys
you press* to produce the behavior, the exact screen output you see,
and the screen output you expected to see.

Reply via email to