On Sat, Jun 24, 2017 at 01:17:23PM -0400, Chet Ramey wrote: [...] > You haven't exported these. If you had, the subshell started to run the > script would have the correct values.
Hm. I think this may be a documentation / usability problem. The manual states the following: COLUMNS Used by the select compound command to determine the terminal width when printing selection lists. *Automatically set if the checkwinsize option is enabled* or in an interactive shell upon receipt of a SIGWINCH. [...] checkwinsize If set, bash checks the window size after each command and, if necessary, updates the values of LINES and COLUMNS. Furthermore, POSIX [1] says the following: COLUMNS This variable shall represent a decimal integer >0 used to indicate the user's preferred width in column positions for the terminal screen or window; see Column Position. If this variable is unset or null, the implementation determines the number of columns, appropriate for the terminal or window, in an unspecified manner. When COLUMNS is set, any terminal-width information implied by TERM is overridden. Users and conforming applications should not set COLUMNS unless they wish to override the system selection and produce output unrelated to the terminal characteristics. Users *should not need to set this variable in the environment* unless there is a specific reason to override the implementation's default behavior, such as to display data in an area arbitrarily smaller than the terminal or window. So, from the manual alone, I know the following: - `select' uses the COLUMNS variable to determine the terminal width - the value of COLUMNS is automatically set if the `checkwinsize' option is enabled (** restrictions apply). - bash checks the window size after each command I have the following problems with the documentation: - It seems to imply that it's set automatically *when* `checkwinsize' is enabled. A careful reading uncovers that this is not true though, and that you have to run a command for the window size to be checked. - It doesn't mention that the window size is NOT checked after *builtin* commands. - POSIX recommends against exporting the COLUMNS variable. I know that I can get the desired behavior by either: - Running the script under an interactive shell - Setting `checkwinsize' and running a dummy external command to trigger the window size check. - Exporting the COLUMNS variable from the parent interactive shell. I think that's too much hassle, when bash could easily: - If the `select' statement is used and `checkwinsize' is set and `COLUMNS' is unset, then call `get_new_window_size' - Call `get_new_window_size' when `checkwinsize' is enabled. [1] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03 -- Eduardo Bustamante https://dualbus.me/