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ą:
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ę tput
w 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, $TERM
nie 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 $TERM
nie są ustawione?
AKTUALIZACJA 2
Jednym z rozwiązań, które próbowałem, było sprawdzenie, czy $TERM
został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 tput
doszło do wniosku, że tak nie było.
.profile
działa niezależnie od domyślnej powłokiOdpowiedzi:
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:
źródło
.bashrc
mnie zaskakuje. Wartość domyślna.bashrc
zawiera :,# If not running interactively, don't do anything
case $- in *i*) ;; *) return;;
więc ustawienia nie powinny być stosowane, chyba że są interaktywne..bashrc
?[[ $- == *i* ]] || return
Ref: ( askubuntu.com/a/1070182/362122 )Jeśli to zrobisz
Naprawi to twój problem. Bez opcji -s tty wyświetli twój tty lub napisze „not tty”
źródło
tty
ze 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żetest -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, powiedzmyless
.Dla mnie dodawanie
aby
/etc/profile
była jedyną rzeczą, która rozwiązuje ten problem. W rzeczywistości błąd dał nam podpowiedź:No value for $TERM
źródło
[ 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 zsh
docker exec -it <container> zsh
(-i dla interaktywnego)) jedynym sposobem na naprawienie tego jest ustawienie zmiennej jakENV TERM xterm-256color
w pliku Docker dla tego obrazu.Podejścia takie jak
RUN export TERM=xterm-256color
lubRUN echo "export TERM=xterm-256color" >> ~/.zshrc
nie były udane. Możliwe są również inne wartości TERM.źródło
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).
źródło
gnome-terminal
lubsakura
sakura
. Wydaje się jednak, że jest to problem z opakowaniem terminala gnome; jeśli tak, to dlaczego nie to naprawić?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-session
teraz działa pod bash (wcześniej sh). Dlatego jego pozyskiwanie~/.profile
prowadzi do~/.profile
pozyskiwania~/.bashrc
. Być może oznacza to, że domyślną zawartość~/.profile
należy zmienić.Najłatwiejszą rzeczą, jaką możesz zrobić, aby to naprawić, jest, jak sugerowałeś, wywoływanie tput tylko wtedy, gdy ustawiono $ TERM.
źródło