On 6/24/17 10:46 AM, Eduardo A. Bustamante López wrote: > I think this is an easier way to reproduce the problem. I have a terminal > window with the following dimensions: > > dualbus@debian:~$ declare -p COLUMNS LINES > declare -- COLUMNS="191" > declare -- LINES="49" > > dualbus@debian:~$ bash --version | head -n1 > GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu) > > Running the script in `interactive' mode (which triggers calls to > `get_new_window_size' through `get_tty_state' when checkwinsize is > enabled), lays out the options on seven columns:
Yes, bash is actually doing more work here than it should. The reason for the calls to get_tty_state is if a program terminates prematurely and leaves the terminal in a state where interactive input is inconvenient (noecho mode, for example). If bash isn't reading input from the terminal, this isn't strictly necessary. But for now, it works. > Whereas running the same script in `non-interactive' mode results in three > columns. Yes, there's no reason to worry about tty settings, so the shell relies on the environment for the value of COLUMNS. If it's not there, or doesn't have a sane value, select defaults to 80. > So the trick is to run an external command in foreground. To see why this > works, read: > http://git.savannah.gnu.org/cgit/bash.git/tree/jobs.c?h=devel#n3390 Yes, since the point is to protect interactive shell input from badly- behaved external programs that can modify the terminal settings. The shell knows what it does to the terminal and how to undo it. Chet -- ``The lyf so short, the craft so long to lerne.'' - Chaucer ``Ars longa, vita brevis'' - Hippocrates Chet Ramey, UTech, CWRU c...@case.edu http://cnswww.cns.cwru.edu/~chet/