Я пытаюсь использовать tput
в сценарии Bash и прилагаю все усилия, чтобы избежать случайной ошибки. С этой целью я написал следующую строку:Любопытное поведение tput, с перенаправлением stderr
COLS="$(tput cols 2> /dev/null)"
К моему удивлению, когда я запускаю это, COLS
не последовательно устанавливаются в 80
, независимо от того, что ширина моего окна терминала случается. (. Ради демонстрации, мой терминал случается 115 столбцов в ширину) Для того, чтобы выяснить, что происходит, я попробовал несколько вещей, в командной строке:
$ tput cols
115
$ tput cols | cat
115
$ echo "$(tput cols)"
115
$ tput cols 2> /dev/null
115
$ echo "$(tput cols 2> /dev/null)"
80
Так, tput
кажется, успех при определении характеристик терминала при перенаправлении его stderr или при встраивании в процесс замещения, но не в обоих. Как странно!
Я тестировал это как на Linux, так и на OS X, и поведение такое же.
Что здесь происходит? И как практический вопрос, что лучший способ получить tput
для работы при подавлении stderr spew?
Примечание: я знаю о $COLUMNS
. Меня особенно интересует использование tput
.
То же поведение в 'zsh',' dash' и 'ksh', поэтому это будет выглядеть независимо от оболочки, используемой для запуска' tput'. – chepner