Nenhum valor para $ TERM e não -T especificado


22

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: tput: nenhum valor para $ TERM e nenhum -T especificado

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 tputno 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, $TERMnã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 $TERMnão estiver definido?

ATUALIZAÇÃO 2

Uma solução que tentei foi verificar se $TERMestava 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 tputainda concluiu que não era.


1
Se não me engano .profileé executado independentemente do shell default
Sergiy Kolodyazhnyy

@Erg, mas durante um login no shell da GUI? Além disso, nem sempre vi esse problema.
Sildoreth 4/03/15

Bem, sim, ele deve ser executado no login do usuário e é exatamente isso que você estava fazendo #
Sergiy Kolodyazhnyy 4/15/15

Respostas:


13

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:

if [[ $- == *i* ]]; then
  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)
fi

Ah, essa é uma solução elegante. :)
Gunnar Hjalmarsson

2
Se isso acontecer .bashrc, acho surpreendente. O padrão .bashrcconté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.
Muru

@muru Meu arquivo .bashrc não é o padrão. :)
Sildoreth

Mas onde você fez isso? em .bashrc?
jjmerelo

Eu acho que se você colocar isso na parte superior do seu arquivo, é mais limpo: [[ $- == *i* ]] || returnRef: ( askubuntu.com/a/1070182/362122 )
Klik

9

Se você fizer isto

if tty -s
then
    : # your tput commands
fi

Isso resolverá o seu problema. Sem a opção -s, tty exibirá seu tty ou gravará "not a tty"


A descrição ttyde 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. Talvez test -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, digamos less,.
TheDudeAbides 25/03

6

Para mim, adicionando

export TERM=xterm

a /etc/profileera a única coisa que resolveu o problema. Na verdade, o erro nos deu uma dica:No value for $TERM


4

[ 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 zshdocker exec -it <container> zsh (-i para interativa)), a única maneira de corrigir isso era definir a variável como ENV TERM xterm-256colorno Dockerfile para esta imagem.

Abordagens como RUN export TERM=xterm-256color ou RUN echo "export TERM=xterm-256color" >> ~/.zshrcnão foram bem-sucedidas. Outros valores para TERM também são possíveis.


3

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

  Selection    Path                             Priority   Status
------------------------------------------------------------
  0            /usr/bin/gnome-terminal.wrapper   40        auto mode
  1            /usr/bin/gnome-terminal.wrapper   40        manual mode
  2            /usr/bin/koi8rxterm               20        manual mode
* 3            /usr/bin/lxterm                   30        manual mode
  4            /usr/bin/sakura                   40        manual mode
  5            /usr/bin/uxterm                   20        manual mode
  6            /usr/bin/xterm                    20        manual mode

Press enter to keep the current choice[*], or type selection number:  

Quando eu tento isso, ele diz "Existe apenas uma alternativa no grupo de links x-terminal-emulator [...] Nada para configurar". Está na minha máquina Kubuntu.
Sildoreth 4/03/15

Tente instalar outro emulador de terminal, por exemplo, gnome-terminalousakura
Sergiy Kolodyazhnyy 4/15

Eu tive exatamente o mesmo problema. Eu selecionei sakura. No entanto, isso parece ser um problema com o invólucro do terminal gnome; Se sim, por que não consertar isso?
jjmerelo

Na verdade, não resolve o problema.
jjmerelo

2
@jjmerelo Como o OP revelou mais tarde em sua resposta, ele tinha linhas em seu arquivo .bashrc, que estava dando o erro. O wrapper de terminal do Gnome não deve ser o problema. Meu palpite inicialmente era que a variável $ TERM não estava definida, ou seja, outro usuário, Gunnar, mencionado em sua resposta.
Sergiy Kolodyazhnyy 14/03/2015

1

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-sessionagora é executado no bash (anteriormente sh). É por isso que sua fonte de ~/.profileresultados resulta em ~/.profilefontes ~/.bashrc. Possivelmente, isso significa que o conteúdo padrão de ~/.profiledeve ser alterado.

A coisa mais fácil que você pode fazer para corrigi-lo é, como você sugeriu, apenas chamar tput se $ TERM estiver definido.


Tentei verificar se $ TERM foi definido, mas não parecia funcionar.
Sildoreth

@Sildoreth: Você pode nos mostrar o código exato para fazer isso? (Por favor, editar a sua pergunta novamente.)
Gunnar Hjalmarsson

adicionado à pergunta
Sildoreth 4/15

@Sildoreth: Vi. Talvez seja porque tput é chamado em subprocessos. (Apenas um palpite.) De qualquer forma, você encontrou uma boa maneira de lidar com isso.
Gunnar Hjalmarsson
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.