Kein Wert für $ TERM und kein -T angegeben

22

Ich habe kürzlich ein Upgrade (mit apt-get dist-upgrade) meiner Kubuntu und Lubuntu Linux-Boxen durchgeführt. Jedes Mal, wenn ich mich bei einem dieser Computer anmelde, erhalte ich die folgende Meldung:

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

Hier ist ein Screenshot der genauen Nachricht: tput: Kein Wert für $ TERM und kein -T angegeben

Dies geschah sowohl auf meinem Lubuntu-Rechner als auch auf meinem Kubuntu-Rechner, und es war kein Problem, bis ich ein Upgrade durchgeführt hatte. daher vermute ich, dass es kein benutzerfehler war.

Wie kann ich das beheben?

AKTUALISIEREN

Ich habe dies in meiner .bashrc-Datei nachverfolgt, die von meiner .profile-Datei aufgerufen wird. Die Tatsache, dass meine .bashrc-Datei jetzt ausgeführt wird, wenn ich mich über die Benutzeroberfläche anmelde, während dies vor dem Upgrade nicht der Fall war, ist etwas seltsam. Und nein, ich habe in letzter Zeit weder meine .bashrc-Datei noch mein .profile geändert. Außerdem ist bash nicht meine Standardshell.

Das Problem ist, dass ich tputmeine .bashrc-Datei aufrufe, um Variablen für das Hinzufügen von Farben zur Eingabeaufforderung einzurichten. Aber zu dem (unangemessenen) Zeitpunkt, an dem meine .bashrc-Datei jetzt ausgeführt wird, $TERMist nichts festgelegt.

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)

Aktualisierte Frage: Wie soll ich das beheben? Soll ich $TERMmich setzen? Oder sollte ich diese Variablen einfach nicht setzen, wenn $TERMnicht gesetzt?

UPDATE 2

Eine Lösung, die ich versuchte, war zu überprüfen, ob $TERMeingestellt war. Aber das schien nicht zu funktionieren; Ich habe immer noch die gleiche Fehlermeldung. Hier ist der Code:

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

So offenbar $TERM wurde eingestellt, aber tputnoch geschlossen war es nicht.

Sildoreth
quelle
1
Wenn ich mich nicht irre .profileläuft unabhängig von der Standard-Shell
Sergiy Kolodyazhnyy
@ Serg aber während eines GUI-Shell-Logins? Auch dieses Problem habe ich nicht immer gesehen.
Sildoreth,
Nun ja, es sollte beim Anmelden des Benutzers ausgeführt werden und genau das haben Sie getan
Sergiy Kolodyazhnyy

Antworten:

13

Was letztendlich für mich funktionierte, war zu überprüfen, ob es sich bei der Shell um eine interaktive Shell handelte. Ich habe die Lösung auf diesen anderen Beitrag unter unix.stackexchange gestützt: So überprüfen Sie, ob eine Shell angemeldet / interaktiv / batch ist .

Der Code für die Lösung lautete also:

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
Sildoreth
quelle
Aha, das ist eine elegante Lösung. :)
Gunnar Hjalmarsson
2
Wenn dies in ist .bashrc, finde ich es überraschend. Die Standardeinstellung .bashrcenthält # If not running interactively, don't do anything case $- in *i*) ;; *) return;;:, daher sollten Ihre Einstellungen nur dann angewendet werden, wenn sie interaktiv sind.
muru
@muru Meine .bashrc-Datei ist keine Standarddatei. :)
Sildoreth
Aber wo hast du das gemacht? in .bashrc?
JJMERELO
Ich denke, wenn Sie dies oben in Ihre Datei setzen, ist es sauberer: [[ $- == *i* ]] || returnRef: ( askubuntu.com/a/1070182/362122 )
Klik
9

Wenn du das tust

if tty -s
then
    : # your tput commands
fi

Es wird Ihr Problem beheben. Ohne die Option -s zeigt tty entweder Ihre tty an oder schreibt "not a tty"

Robert Jacobs
quelle
Die Beschreibung des ttyvon seiner Hand-Seite ist „die Dateinamen der Standardeingabe verbunden des Terminals ausdrucken.“ Wenn es sich bei der Standardeingabe Ihres Skripts um eine Pipe handelt, schlägt dieser Test fehl. Dies hat zur Folge, dass Ihr Programm das Drucken von Farben in der Ausgabe stoppt, nur weil die Eingabe über eine Pipe erfolgt. Vielleicht test -t 1(auf Englisch: "Ist stdout mit einem Terminal verbunden?") Möchten Sie das wirklich? Auf diese Weise erhalten Sie nur dann Farben , wenn die Ausgabe an ein Terminal gesendet wird, und es werden keine seltsamen Terminalcodes angezeigt, wenn Sie die Ausgabe in eine Datei umleiten oder sie beispielsweise weiterleiten less.
TheDudeAbides
6

Für mich fügte hinzu

export TERM=xterm

zu /etc/profilewar das einzige , was das Problem gelöst. Eigentlich gab uns der Fehler einen Hinweis:No value for $TERM

jjmerelo
quelle
4

[ Anderes Szenario, aber Suchmaschine führen mich hier zuerst]

Wenn der Fehler " tput: Kein Wert für $ TERM und kein -T angegeben " in einem Docker- Container auftritt (für mich bestand die einzige Möglichkeit, dies zu beheben, darin, die Variable festzulegen , wenn eine zsh- Shell aufgerufen wurde docker exec -it <container> zsh(-i für interaktiv)) wie ENV TERM xterm-256colorin der Dockerfile für dieses Bild.

Ansätze mögen RUN export TERM=xterm-256color oder RUN echo "export TERM=xterm-256color" >> ~/.zshrcwaren nicht erfolgreich. Andere Werte für TERM sind ebenfalls möglich.

mga0
quelle
3

Versuchen Sie, das Terminal zu öffnen (egal welches, sogar tty1) und führen Sie diese Zeile aus

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

Sie erhalten die Auswahl des Standard-Terminalemulators für x window. Wählen Sie eine aus, indem Sie die Nummer auswählen, und starten Sie den Computer neu, wenn Sie fertig sind.

$ sudo update-alternatives --config x-terminal-emulator
Es gibt 6 Möglichkeiten für den alternativen x-terminal-emulator (mit / 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:  
Sergiy Kolodyazhnyy
quelle
Wenn ich dies versuche, wird mir mitgeteilt, dass es in der Verbindungsgruppe x-terminal-emulator [...] nur eine Alternative gibt, die nicht konfiguriert werden muss. Dies ist auf meinem Kubuntu-Rechner.
Sildoreth,
Versuchen Sie, einen anderen Terminal-Emulator zu installieren, zum Beispiel gnome-terminalodersakura
Sergiy Kolodyazhnyy
Ich hatte genau das gleiche Problem. Ich habe ausgewählt sakura. Dies scheint jedoch ein Problem mit dem GNOME-Terminal-Wrapper zu sein. Wenn ja, warum das nicht beheben?
JJMERELO
Es behebt das Problem eigentlich nicht.
JJMERELO
2
@jjmerelo Wie OP später in seiner Antwort offenbarte, hatte er Zeilen in seiner .bashrc-Datei, die den Fehler lieferte. Gnome Terminal Wrapper sollte nicht das Problem sein. Ich schätze anfangs, dass die Variable $ TERM nicht gesetzt war. Dies war ein anderer Benutzer, Gunnar, der in seiner Antwort erwähnt wurde.
Sergiy Kolodyazhnyy
1

Der Fehlerdialog ist auf die Behebung des Fehlers # 678421 zurückzuführen , daher ist es meine Schuld. ;) Es informiert Sie über Fehler aufgrund einiger Befehle in einer Ihrer Konfigurationsdateien. Wenn Sie nach oben scrollen, können Sie sehen, welche Datei die Fehlermeldungen verursacht.

Möglicherweise reicht Sergs Antwort aus, um den Warndialog loszuwerden.

Bearbeiten:

Möchte aufgrund der aktualisierten Frage ein paar Dinge hinzufügen.

Im Gegensatz zu früher /usr/sbin/lightdm-sessionwird jetzt unter bash (bisher sh) gefahren. Das ist der Grund, warum die Beschaffung von ~/.profileErgebnissen in der ~/.profileBeschaffung erfolgt ~/.bashrc. Möglicherweise bedeutet dies, dass der Standardinhalt von ~/.profilegeändert werden sollte.

Wie Sie vorgeschlagen haben, können Sie dies am einfachsten beheben, indem Sie tput nur aufrufen, wenn $ TERM festgelegt ist.

Gunnar Hjalmarsson
quelle
Ich habe versucht zu überprüfen, ob $ TERM gesetzt war, aber es schien nicht zu funktionieren.
Sildoreth
@Sildoreth: Kannst du uns bitte den genauen Code dafür zeigen? (Bitte bearbeiten Sie Ihre Frage erneut.)
Gunnar Hjalmarsson
zur Frage hinzugefügt
Sildoreth
@Sildoreth: Sah es. Vielleicht liegt es daran, dass tput in Unterprozessen aufgerufen wird. (Nur eine Vermutung.) Wie auch immer, Sie haben einen guten Weg gefunden, damit umzugehen.
Gunnar Hjalmarsson