Согласно strace
этому, это происходит потому, что tput
только пытается прочитать настройки tty из его stdout и stderr (fd 1 & 2). Поскольку вы явно перенаправили stderr, а $( )
также перенаправили stdout, tput сдается.
Наилучшим решением было бы залатать tput также проверить стандартный ввод на наличие в TTY; однако вы также можете просто удалить 2>/dev/null
перенаправление, так как tput cols
никогда не выводите никаких сообщений об ошибках. (И если он выводит некоторые сообщения об ошибках, лучше обратить на них внимание.)