De acordo com strace
, isso acontece porque tput
apenas tenta ler as configurações do stdout e stderr (fd 1 & 2). Como você redirecionou explicitamente o stderr e o $( )
também redireciona o stdout, o tput desiste.
A melhor solução seria remendar o tput para também verificar stdin para a presença de um tty; no entanto, você também pode remover apenas o 2>/dev/null
redirect, já que tput cols
nunca exibe nenhuma mensagem de erro. (E se ele gerou algumas mensagens de erro, é melhor prestar atenção nelas.)