Atualizei recentemente (com apt-get dist-upgrade
) minhas caixas Kubuntu e Lubuntu Linux e agora toda vez que faço login em uma dessas máquinas, recebo esta mensagem:
tput: No value for $TERM and no -T specified
Aqui está uma captura de tela da mensagem exata:
Isso aconteceu nas máquinas Lubuntu e Kubuntu, e não foi um problema até depois da atualização; então eu suspeito que não foi um erro do usuário.
Como posso consertar isso?
ATUALIZAR
Eu rastreei isso no meu arquivo .bashrc, que está sendo chamado pelo meu arquivo .profile. No entanto, o fato de o meu arquivo .bashrc agora ser executado quando eu faço um login na GUI, enquanto não era antes da atualização é um pouco estranho. E não, não modifiquei meu arquivo .bashrc ou meu .profile recentemente. Além disso, o bash não é meu shell padrão.
O problema é que estou chamando tput
no meu arquivo .bashrc para configurar variáveis para usar na adição de cores ao prompt. Mas no momento (inapropriado) quando meu arquivo .bashrc agora é executado, $TERM
não está definido.
fgRed=$(tput setaf 1) ; fgGreen=$(tput setaf 2) ; fgBlue=$(tput setaf 4)
fgMagenta=$(tput setaf 5) ; fgYellow=$(tput setaf 3) ; fgCyan=$(tput setaf 6)
fgWhite=$(tput setaf 7) ; fgBlack=$(tput setaf 0)
bgRed=$(tput setab 1) ; bgGreen=$(tput setab 2) ; bgBlue=$(tput setab 4)
bgMagenta=$(tput setab 5) ; bgYellow=$(tput setab 3) ; bgCyan=$(tput setab 6)
bgWhite=$(tput setab 7) ; bgBlack=$(tput setab 0)
Pergunta atualizada: Como devo corrigir isso? Devo me colocar $TERM
? Ou devo apenas não definir essas variáveis se $TERM
não estiver definido?
ATUALIZAÇÃO 2
Uma solução que tentei foi verificar se $TERM
estava definido. Mas isso não parecia funcionar; Ainda recebi a mesma mensagem de erro. Aqui está o código:
if [ ! "$TERM" = "" ]; then
#Do stuff here
fi
Então, aparentemente, $TERM
foi definido, mas tput
ainda concluiu que não era.
.profile
é executado independentemente do shell defaultRespostas:
O que funcionou para mim foi verificar se o shell era um shell interativo. Baseei a solução neste outro post em unix.stackexchange: Como verificar se um shell é login / interativo / lote .
Portanto, o código para a solução era:
fonte
.bashrc
, acho surpreendente. O padrão.bashrc
contém :,# If not running interactively, don't do anything
case $- in *i*) ;; *) return;;
portanto, suas configurações não devem ser aplicadas, a menos que sejam interativas..bashrc
?[[ $- == *i* ]] || return
Ref: ( askubuntu.com/a/1070182/362122 )Se você fizer isto
Isso resolverá o seu problema. Sem a opção -s, tty exibirá seu tty ou gravará "not a tty"
fonte
tty
de sua página do manual é "imprimir o nome do terminal conectado à entrada padrão de arquivo." Se o stdin do seu script for um canal, esse teste falhará, com a conseqüência de que seu programa interrompe a impressão de cores em sua saída apenas porque sua entrada é proveniente de um canal. Talveztest -t 1
(em inglês: "o stdout esteja conectado a um terminal?") Seja o que você realmente deseja? Dessa forma, você obtém cores apenas se a saída estiver indo para um terminal e você não verá códigos estranhos de terminal se redirecionar sua saída para um arquivo ou canalizá-lo, digamosless
,.Para mim, adicionando
a
/etc/profile
era a única coisa que resolveu o problema. Na verdade, o erro nos deu uma dica:No value for $TERM
fonte
[ Cenário diferente, mas o mecanismo de pesquisa me leva aqui primeiro]
Quando o erro " tput: nenhum valor para $ TERM e não -T especificado " ocorre em um contêiner do Docker (para mim, ao abrir uma chamada de shell zsh
docker exec -it <container> zsh
(-i para interativa)), a única maneira de corrigir isso era definir a variável comoENV TERM xterm-256color
no Dockerfile para esta imagem.Abordagens como
RUN export TERM=xterm-256color
ouRUN echo "export TERM=xterm-256color" >> ~/.zshrc
não foram bem-sucedidas. Outros valores para TERM também são possíveis.fonte
Tente abrir o terminal (não importa qual, até o tty1 fará) e execute esta linha
sudo update-alternatives --config x-terminal-emulator
Você verá a escolha do emulador de terminal padrão para a janela x. Escolha um selecionando o número e reinicie depois que terminar.
$ sudo update-alternative --config x-terminal-emulator
Existem 6 opções para o emulador x-terminal alternativo (fornecendo / usr / bin / x-terminal-emulator).
fonte
gnome-terminal
ousakura
sakura
. No entanto, isso parece ser um problema com o invólucro do terminal gnome; Se sim, por que não consertar isso?O diálogo de erro é devido à correção do bug # 678421 , então a culpa é minha. ;) Informa sobre erros devido a alguns comandos em um dos seus arquivos de configuração. Se você rolar para o topo, poderá ver qual arquivo está causando as mensagens de erro.
Possivelmente a resposta de Serg é suficiente para se livrar da caixa de diálogo de aviso.
Editar:
Gostaria de adicionar algumas coisas devido à pergunta atualizada.
Diferentemente de antes,
/usr/sbin/lightdm-session
agora é executado no bash (anteriormente sh). É por isso que sua fonte de~/.profile
resultados resulta em~/.profile
fontes~/.bashrc
. Possivelmente, isso significa que o conteúdo padrão de~/.profile
deve ser alterado.A coisa mais fácil que você pode fazer para corrigi-lo é, como você sugeriu, apenas chamar tput se $ TERM estiver definido.
fonte