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.)