Не задано значение для $ TERM и не указан -T

22

Я недавно обновил (с помощью apt-get dist-upgrade) свои Kubuntu и Lubuntu Linux, и теперь каждый раз, когда я захожу на одну из этих машин, я получаю следующее сообщение:

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

Вот скриншот точного сообщения: tput: не указано значение для $ TERM и не указан -T

Это происходило как на моей машине Lubuntu, так и на машине Kubuntu, и это не было проблемой, пока я не обновился; поэтому я подозреваю, что это была не ошибка пользователя.

Как я могу это исправить?

ОБНОВИТЬ

Я отследил это до моего файла .bashrc, который вызывается моим файлом .profile. Хотя тот факт, что мой файл .bashrc теперь запускается, когда я делаю вход в систему с графическим интерфейсом, в то время как это было до обновления, немного странно. И нет, я недавно не модифицировал ни мой файл .bashrc, ни мой .profile. Кроме того, bash не моя оболочка по умолчанию.

Проблема в том, что я звоню tputв своем файле .bashrc, чтобы установить переменные для использования при добавлении цвета в подсказку. Но в (неподходящее) время, когда мой файл .bashrc теперь запускается, $TERMне устанавливается.

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)

Обновленный вопрос: как мне это исправить? Должен ли я установить $TERMсебя? Или я просто не должен устанавливать эти переменные, если $TERMне установлен?

ОБНОВЛЕНИЕ 2

Одно из решений, которое я попробовал, состояло в том, чтобы проверить, $TERMбыло ли установлено. Но это не сработало; Я все еще получил то же сообщение об ошибке. Вот код:

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

Таким образом, очевидно, $TERM был установлен, но tputвсе же пришел к выводу, что это не так

Sildoreth
источник
1
Если я не ошибаюсь .profileзапускается независимо от оболочки по умолчанию
Сергей Колодяжный
@Serg а во время входа в оболочку GUI? Кроме того, я не всегда видел эту проблему.
Сильдорет
Ну, да, его нужно запускать при входе пользователя, и это именно то, что вы делали
Сергей Колодяжный,

Ответы:

13

В конечном итоге мне удалось проверить, была ли оболочка интерактивной. Я основал решение на этом другом посте в unix.stackexchange: Как проверить, является ли оболочка логином / интерактивной / пакетной .

Итак, код для решения был:

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
источник
Ага, это элегантное решение. :)
Гуннар Хьялмарссон
2
Если это так .bashrc, я нахожу это удивительным. Значение по умолчанию .bashrcсодержит:, # If not running interactively, don't do anything case $- in *i*) ;; *) return;;поэтому ваши настройки не должны применяться, если они не являются интерактивными.
Муру
@muru Мой файл .bashrc очень нестандартный. :)
Sildoreth
Но где ты это сделал? в .bashrc?
jjmerelo
Я думаю , что если вы поставите это в верхней части вашего файла это очистителя: [[ $- == *i* ]] || returnRef: ( askubuntu.com/a/1070182/362122 )
Klik
9

Если вы делаете это

if tty -s
then
    : # your tput commands
fi

Это исправит вашу проблему. Без опции -s tty покажет ваш tty или напишет "не tty"

Роберт Джейкобс
источник
Описание ttyсо страницы руководства - «распечатать имя файла терминала, подключенного к стандартному вводу». Если stdin вашего скрипта является конвейером, этот тест не пройден, в результате чего ваша программа прекращает печатать цвета в своем выводе только потому, что его ввод поступает из конвейера. Может быть test -t 1(по-английски: "подключен ли stdout к терминалу?"), Что вы действительно хотите? Таким образом, вы получаете цвета только в том случае, если вывод идет на терминал, и вы не увидите странных кодов терминала, если перенаправите его вывод в файл или передадите, скажем, через него less.
TheDudeAbides
6

Для меня добавление

export TERM=xterm

чтобы /etc/profileбыли единственным , что решить эту проблему. Собственно, ошибка подсказала нам:No value for $TERM

jjmerelo
источник
4

[ Другой сценарий, но поисковая система привела меня сюда сначала]

Когда в контейнере Docker возникает ошибка « tput: нет значения для $ TERM и не указан -T » (для меня при открытии оболочки zsh (-i для интерактивного)) единственный способ исправить это - установить переменную как в Dockerfile для этого изображения.docker exec -it <container> zshENV TERM xterm-256color

Подходы вроде RUN export TERM=xterm-256color или RUN echo "export TERM=xterm-256color" >> ~/.zshrcне увенчались успехом. Другие значения для TERM также возможны.

mga0
источник
3

Попробуйте открыть терминал (не имеет значения, что подойдет даже tty1) и запустите эту строку

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

Вам будет представлен выбор эмулятора терминала по умолчанию для окна x. Выберите один, выбрав номер, и перезагрузите компьютер после завершения.

$ sudo update-alternatives --config x-терминал-эмулятор
Существует 6 вариантов альтернативного x-терминал-эмулятора (предоставляя / usr / bin / x-терминал-эмулятор).

  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:  
Сергей Колодяжный
источник
Когда я пытаюсь это сделать, он говорит мне: «В группе ссылок x-терминал-эмулятор есть только одна альтернатива [...] Ничего не настраивается». Это на моей машине Kubuntu.
Сильдорет
Попробуйте установить другой эмулятор терминала, например gnome-terminalилиsakura
Сергей Колодяжный
У меня была точно такая же проблема. Я выбрал sakura. Однако, это, похоже, проблема с оболочкой терминала gnome; если так, то почему бы не исправить это?
jjmerelo
На самом деле это не решает проблему.
jjmerelo
2
@jjmerelo Как OP позже показал в своем ответе, у него были строки в его файле .bashrc, который выдавал ошибку. Терминал Gnome не должен быть проблемой. Сначала я предположил, что переменная $ TERM не была установлена, о чем упоминал другой пользователь, Гуннар, в своем ответе.
Сергей Колодяжный
1

Диалог ошибки связан с исправлением ошибки # 678421 , поэтому я виноват. ;) Он сообщает вам об ошибках из-за некоторых команд в одном из ваших файлов конфигурации. Если вы прокрутите вверх, вы увидите, какой файл вызывает сообщения об ошибках.

Возможно, ответа Серга достаточно, чтобы избавиться от предупреждающего диалога.

Редактировать:

Хотелось бы добавить пару вещей в связи с обновленным вопросом.

В отличие от ранее, /usr/sbin/lightdm-sessionтеперь запускается под Bash (ранее Sh). Вот почему его поиск ~/.profileрезультатов в ~/.profileпоиске ~/.bashrc. Возможно, это означает, что содержимое по умолчанию ~/.profileдолжно быть изменено.

Самое простое, что вы можете сделать, чтобы исправить это, как вы предложили, это вызывать tput, только если установлена ​​переменная $ TERM.

Гуннар Хьялмарссон
источник
Я попытался проверить, был ли установлен $ TERM, но, похоже, это не сработало.
Сильдорет
@Sildoreth: Не могли бы вы показать нам точный код для этого? (Пожалуйста, измените ваш вопрос еще раз.)
Гуннар Хьялмарссон
добавлено в вопрос
Sildoreth
@Sildoreth: видел это. Может быть, это потому, что tput вызывается в подпроцессах. (Просто предположение.) В любом случае, вы нашли хороший способ справиться с этим.
Гуннар Хьялмарссон