Brak wartości dla $ TERM i nie podano -T

22

Niedawno zaktualizowałem (wraz z apt-get dist-upgrade) moim systemem Linux Kubuntu i Lubuntu, a teraz za każdym razem, gdy loguję się do jednej z tych maszyn, pojawia się następujący komunikat:

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

Oto zrzut ekranu z dokładną wiadomością: tput: Brak wartości dla $ TERM i nie podano -T

Stało się tak zarówno na mojej maszynie Lubuntu, jak i na maszynie Kubuntu, i nie było problemu, dopóki nie zaktualizowałem; więc podejrzewam, że to nie był błąd użytkownika.

Jak mogę to naprawić?

AKTUALIZACJA

Śledziłem to do mojego pliku .bashrc, który jest wywoływany przez mój plik .profile. Chociaż fakt, że mój plik .bashrc jest teraz uruchomiony, gdy loguję się w interfejsie GUI, a nie przed aktualizacją, jest trochę dziwny. I nie, nie zmodyfikowałem ostatnio mojego pliku .bashrc ani .profile. Poza tym bash nie jest moją domyślną powłoką.

Problem polega na tym, że dzwonię tputw pliku .bashrc, aby skonfigurować zmienne do użycia w dodawaniu kolorów do monitu. Ale w (nieodpowiednim) czasie, gdy mój plik .bashrc jest teraz uruchamiany, $TERMnie jest ustawiony.

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)

Zaktualizowane pytanie: Jak to naprawić? Czy powinienem się ustawić $TERM? A może powinienem po prostu nie ustawiać tych zmiennych, jeśli $TERMnie są ustawione?

AKTUALIZACJA 2

Jednym z rozwiązań, które próbowałem, było sprawdzenie, czy $TERMzostało ustawione. Ale to nie działało; Nadal pojawia się ten sam komunikat o błędzie. Oto kod:

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

Najwyraźniej tak $TERM było , ale tputdoszło do wniosku, że tak nie było.

Sildoreth
źródło
1
Jeśli się nie mylę, .profiledziała niezależnie od domyślnej powłoki
Sergiy Kolodyazhnyy
@Erg, ale podczas logowania powłoki GUI? Ponadto nie zawsze widziałem ten problem.
Sildoreth,
Cóż, tak, należy uruchomić po zalogowaniu się użytkownika i właśnie to robiłeś
Sergiy Kolodyazhnyy

Odpowiedzi:

13

Ostatecznie zadziałało dla mnie sprawdzenie, czy powłoka jest powłoką interaktywną. Oparłem rozwiązanie na tym innym poście w unix.stackexchange: Jak sprawdzić, czy powłoka jest login / Interactive / Batch .

Tak więc kod rozwiązania to:

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
źródło
Aha, to eleganckie rozwiązanie. :)
Gunnar Hjalmarsson
2
Jeśli tak, to .bashrcmnie zaskakuje. Wartość domyślna .bashrczawiera :, # If not running interactively, don't do anything case $- in *i*) ;; *) return;;więc ustawienia nie powinny być stosowane, chyba że są interaktywne.
muru
@muru Mój plik .bashrc jest bardzo inny niż domyślny. :)
Sildoreth,
Ale gdzie to zrobiłeś? w .bashrc?
jjmerelo
Myślę, że jeśli umieścisz to u góry pliku, będzie czystsze: [[ $- == *i* ]] || returnRef: ( askubuntu.com/a/1070182/362122 )
Klik
9

Jeśli to zrobisz

if tty -s
then
    : # your tput commands
fi

Naprawi to twój problem. Bez opcji -s tty wyświetli twój tty lub napisze „not tty”

Robert Jacobs
źródło
Opis ttyze swojej strony podręcznika jest „wydrukować nazwę pliku terminala podłączonego do standardowego wejścia”. Jeśli standardem skryptu jest potok, ten test zakończy się niepowodzeniem, w wyniku czego program przestanie drukować kolory na wyjściu tylko dlatego, że jego wejście pochodzi z potoku. Może test -t 1(po angielsku: „czy stdout jest podłączony do terminala?”) Jest tym, czego naprawdę chcesz? W ten sposób można uzyskać kolory tylko jeśli wyjście idzie do terminala, a nie będzie widać dziwne kody terminali jeśli przekierować jego wyjście do pliku lub potoku go przez, powiedzmy less.
TheDudeAbides
6

Dla mnie dodawanie

export TERM=xterm

aby /etc/profilebyła jedyną rzeczą, która rozwiązuje ten problem. W rzeczywistości błąd dał nam podpowiedź:No value for $TERM

jjmerelo
źródło
4

[ Inny scenariusz, ale najpierw prowadzi mnie tu wyszukiwarka]

Gdy „ tput: brak wartości dla $ TERM i nieokreślonego -T ” występuje błąd w kontenerze Docker (dla mnie, gdy otwieram wywołanie powłoki zshdocker exec -it <container> zsh (-i dla interaktywnego)) jedynym sposobem na naprawienie tego jest ustawienie zmiennej jak ENV TERM xterm-256colorw pliku Docker dla tego obrazu.

Podejścia takie jak RUN export TERM=xterm-256color lub RUN echo "export TERM=xterm-256color" >> ~/.zshrcnie były udane. Możliwe są również inne wartości TERM.

mga0
źródło
3

Spróbuj otworzyć terminal (nieważne, co zrobi nawet tty1) i uruchom tę linię

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

Zostanie wyświetlony wybór domyślnego emulatora terminala dla okna x. Wybierz jeden, wybierając numer, i uruchom ponownie po zakończeniu.

$ sudo update-alternatives --config x-terminal-emulator
Istnieje 6 opcji dla alternatywnego emulatora x-terminal (zapewniającego / 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
źródło
Kiedy próbuję, mówi mi: „Jest tylko jedna alternatywa w emulatorze x-terminal-emulator grupy łączy [...] Nic do skonfigurowania”. To jest na mojej maszynie Kubuntu.
Sildoreth,
Spróbuj zainstalować inny emulator terminala, na przykład gnome-terminallubsakura
Sergiy Kolodyazhnyy
Miałem dokładnie ten sam problem. Wybrałem sakura. Wydaje się jednak, że jest to problem z opakowaniem terminala gnome; jeśli tak, to dlaczego nie to naprawić?
jjmerelo
Właściwie to nie rozwiązuje problemu.
jjmerelo
2
@jjmerelo Jak OP później ujawnił w swojej odpowiedzi, miał linie w swoim pliku .bashrc, który dawał błąd. Owijanie terminali Gnome nie powinno stanowić problemu. Domyślam się początkowo, że zmienna $ TERM nie została ustawiona, a inny użytkownik, Gunnar, wspomniał w swojej odpowiedzi.
Sergiy Kolodyazhnyy
1

Okno dialogowe błędu wynika z poprawki błędu # 678421 , więc to moja wina. ;) Informuje o błędach spowodowanych niektórymi poleceniami w jednym z plików konfiguracyjnych. Po przewinięciu do góry możesz zobaczyć, który plik powoduje komunikaty o błędach.

Być może odpowiedź Serga jest wystarczająca, aby pozbyć się okna dialogowego z ostrzeżeniem.

Edytować:

Chciałbym dodać kilka rzeczy ze względu na zaktualizowane pytanie.

W przeciwieństwie do wcześniejszych, /usr/sbin/lightdm-sessionteraz działa pod bash (wcześniej sh). Dlatego jego pozyskiwanie ~/.profileprowadzi do ~/.profilepozyskiwania ~/.bashrc. Być może oznacza to, że domyślną zawartość ~/.profilenależy zmienić.

Najłatwiejszą rzeczą, jaką możesz zrobić, aby to naprawić, jest, jak sugerowałeś, wywoływanie tput tylko wtedy, gdy ustawiono $ TERM.

Gunnar Hjalmarsson
źródło
Próbowałem sprawdzić, czy ustawiono $ TERM, ale nie działało.
Sildoreth,
@Sildoreth: Czy możesz nam pokazać dokładny kod do tego? (Proszę ponownie edytować swoje pytanie.)
Gunnar Hjalmarsson,
dodano do pytania
Sildoreth,
@Sildoreth: Widziałem to. Może dlatego, że tput jest wywoływany w podprocesach. (Tylko zgadnij.) W każdym razie znalazłeś dobry sposób, aby sobie z tym poradzić.
Gunnar Hjalmarsson,