Nessun valore per $ TERM e nessun -T specificato


22

Di recente ho aggiornato (con apt-get dist-upgrade) le mie scatole Kubuntu e Lubuntu Linux, e ora ogni volta che accedo a una di queste macchine, ricevo questo messaggio:

tput: No value for $TERM and no -T specified

Ecco uno screenshot del messaggio esatto: tput: nessun valore per $ TERM e nessun -T specificato

Questo è successo sia sulla mia macchina Lubuntu che su Kubuntu, e non è stato un problema fino a quando non ho effettuato l'aggiornamento; quindi sospetto che non sia stato un errore dell'utente.

Come posso risolvere questo problema?

AGGIORNARE

Ho rintracciato questo nel mio file .bashrc, che viene chiamato dal mio file .profile. Tuttavia, il fatto che il mio file .bashrc ora venga eseguito quando eseguo un accesso alla GUI, mentre non è stato prima di eseguire l'aggiornamento è un po 'strano. E no, non ho modificato il mio file .bashrc o il mio .profile di recente. Inoltre, bash non è la mia shell predefinita.

Il problema è che sto chiamando tputnel mio file .bashrc per impostare le variabili da utilizzare per aggiungere colore al prompt. Ma al momento (inappropriato) in cui il mio file .bashrc ora viene eseguito, $TERMnon è impostato.

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)

Domanda aggiornata: come devo risolvere questo problema? Dovrei $TERMmettermi? O non dovrei semplicemente impostare queste variabili se $TERMnon è impostato?

AGGIORNAMENTO 2

Una soluzione che ho provato è stata verificare se è $TERMstato impostato. Ma questo non sembra funzionare; Ho ancora ricevuto lo stesso messaggio di errore. Ecco il codice:

if [ ! "$TERM" = "" ]; then
  #Do stuff here
fi

A quanto pare è $TERM stato impostato, ma ha tputcomunque concluso che non lo era.


1
Se non sbaglio .profilecorre indipendentemente dalla shell predefinita
Sergiy Kolodyazhnyy il

@Serg ma durante un login alla shell della GUI? Inoltre, non ho sempre visto questo problema.
Sildoreth,

Bene, sì, dovrebbe essere eseguito dopo l'accesso dell'utente e questo è esattamente quello che stavi facendo
Sergiy Kolodyazhnyy

Risposte:


13

Ciò che alla fine ha funzionato per me è stato verificare se la shell fosse una shell interattiva. Ho basato la soluzione su questo altro post su unix.stackexchange: come verificare se una shell è login / interattivo / batch .

Quindi il codice per la soluzione 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, questa è una soluzione elegante. :)
Gunnar Hjalmarsson

2
Se questo è dentro .bashrc, lo trovo sorprendente. Il valore predefinito .bashrccontiene :, # If not running interactively, don't do anything case $- in *i*) ;; *) return;;quindi le tue impostazioni non dovrebbero essere applicate se non interattive.
muru,

@muru Il mio file .bashrc è molto non predefinito. :)
Sildoreth,

Ma dove l'hai fatto? in .bashrc?
jjmerelo,

Penso che se lo metti in cima al tuo file è più pulito: [[ $- == *i* ]] || returnRif: ( askubuntu.com/a/1070182/362122 )
Klik

9

Se lo fai

if tty -s
then
    : # your tput commands
fi

Risolverà il tuo problema. Senza l'opzione -s tty visualizzerà il tuo tty o scriverà "non un tty"


La descrizione ttydalla sua pagina di manuale è "stampa il nome del file del terminale collegato allo standard input". Se lo stdin del tuo script è una pipe, questo test fallirà, con la conseguenza che il tuo programma smette di stampare i colori nel suo output solo perché il suo input proviene da una pipe. Forse test -t 1(in inglese: "stdout è collegato a un terminale?") È quello che vuoi davvero? In questo modo si ottiene colori solo se l'uscita è andare a un terminale, e non vedrete i codici di terminali strano se si reindirizza l'output in un file o pipe attraverso, ad esempio, less.
TheDudeAbides

6

Per me, aggiungendo

export TERM=xterm

a /etc/profileera l'unica cosa che ha risolto il problema. In realtà, l'errore ci ha dato un suggerimento:No value for $TERM


4

[ Scenario diverso, ma il motore di ricerca mi conduce prima qui]

Quando si verifica l'errore " tput: nessun valore per $ TERM e nessun -T specificato " in un contenitore Docker (per me, quando si apre una shell shell zshdocker exec -it <container> zsh (-i per interattivo)) l'unico modo per risolvere questo problema era impostare la variabile come ENV TERM xterm-256colornel Dockerfile per questa immagine.

Approcci come RUN export TERM=xterm-256color o RUN echo "export TERM=xterm-256color" >> ~/.zshrcnon hanno avuto successo. Sono anche possibili altri valori per TERM.


3

Prova ad aprire il terminale (non importa quale, anche tty1 farà) ed esegui questa linea

sudo update-alternatives --config x-terminal-emulator

Ti verrà presentato con la scelta dell'emulatore di terminale predefinito per x window. Scegline uno selezionando il numero e riavvia al termine.

$ sudo update-alternatives --config x-terminal-emulator
Ci sono 6 scelte per l'emulatore x-terminal alternativo (che fornisce / 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 provo questo, mi dice "Esiste una sola alternativa nel gruppo di collegamenti x-terminal-emulator [...] Niente da configurare". Questo è sulla mia macchina Kubuntu.
Sildoreth,

Prova ad installare un altro emulatore di terminale, ad esempio gnome-terminaloppuresakura
Sergiy Kolodyazhnyy il

Ho avuto esattamente lo stesso problema. Ho selezionato sakura. Tuttavia, questo sembra essere un problema con il wrapper terminale gnome; in tal caso, perché non risolverlo?
jjmerelo,

In realtà non risolve il problema.
jjmerelo

2
@jjmerelo Come OP ha rivelato in seguito nella sua risposta, aveva delle righe nel suo file .bashrc, che stava dando l'errore. Il wrapper del terminale Gnome non dovrebbe essere il problema. Inizialmente la mia ipotesi era che la variabile $ TERM non fosse impostata, che era un altro utente, Gunnar, menzionato nella sua risposta.
Sergiy Kolodyazhnyy,

1

La finestra di dialogo di errore è dovuta alla correzione del bug # 678421 , quindi è colpa mia. ;) Ti dice degli errori dovuti ad alcuni comandi in uno dei tuoi file di configurazione. Se scorri verso l'alto, puoi vedere quale file sta causando i messaggi di errore.

Forse la risposta di Serg è sufficiente per sbarazzarsi della finestra di avviso.

Modificare:

Vorrei aggiungere un paio di cose a causa della domanda aggiornata.

Diversamente da prima, /usr/sbin/lightdm-sessionora viene eseguito sotto bash (precedentemente sh). Ecco perché la sua fonte di ~/.profilerisultati~/.profile sourcing ~/.bashrc. Forse questo significa che il contenuto predefinito di ~/.profiledovrebbe essere cambiato.

La cosa più semplice che puoi fare per risolverlo è, come hai suggerito, chiamare tput solo se $ TERM è impostato.


Ho provato a verificare se $ TERM era impostato, ma non sembrava funzionare.
Sildoreth,

@Sildoreth: Puoi mostrarci il codice esatto per farlo? (Modifica di nuovo la domanda.)
Gunnar Hjalmarsson

aggiunto alla domanda
Sildoreth

@Sildoreth: l'ho visto. Forse è perché tput è chiamato nei sottoprocessi. (Solo una supposizione.) Comunque, hai trovato un modo carino per affrontarlo.
Gunnar Hjalmarsson
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.