Немає значення для $ 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все ж зроблено висновок, що це не так.


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

Ага, це елегантне рішення. :)
Gunnar Hjalmarsson

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 )
Клік

9

Якщо ви це зробите

if tty -s
then
    : # your tput commands
fi

Це виправить вашу проблему. Без опції -s tty або покаже ваш tty, або напише "not tty"


Опис на ttyйого сторінці керівництва - "надрукувати ім'я файлу терміналу, підключеного до стандартного вводу". Якщо stdin вашого сценарію є "трубою", цей тест не вдасться, внаслідок чого ваша програма припиняє друкувати кольори на своєму виході лише тому, що його вхід надходить з труби. Можливо test -t 1(англійською мовою: "підключення stdout до терміналу?") - це те, що ти насправді хочеш? Таким чином , ви отримаєте колір тільки якщо вихід буде термінал, і ви не будете бачити дивні термінальні коди , якщо перенаправити висновок в файл або трубу через це, скажімо, less.
TheDudeAbides

6

Для мене додаю

export TERM=xterm

щоб /etc/profileбуло єдиним, що вирішило проблему. Власне, помилка дала нам підказку:No value for $TERM


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.


3

Спробуйте відкрити термінал (не важливо, який буде навіть tty1) і запустіть цей рядок

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

Вам буде запропоновано вибір емулятора терміналу за замовчуванням для x window. Виберіть його, вибравши номер, і перезавантажте його після завершення.

$ sudo update-alternative --config x-terminal-emulator
Є 6 варіантів альтернативного x-terminal-emulator (надання / 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:  

Коли я це спробую, він говорить мені: "У x-terminal-емуляторі групи посилань є лише одна альтернатива [...] Налаштувати нічого". Це на моїй машині Kubuntu.
Sildoreth

Спробуйте встановити інший термінальний емулятор, наприклад, gnome-terminalабоsakura
Сергій Колодяжний

У мене була точно така ж проблема. Я вибрав sakura. Однак це, здається, є проблемою з обгорткою терміналу gnome; якщо так, то чому б це не виправити?
jjmerelo

Фактично це не виправляє проблеми.
jjmerelo

2
@jjmerelo Як пізніше ОР виявив у своїй відповіді, у своєму файлі .bashrc були рядки, які вказували на помилку. Проблема з терміналом Gnome не повинна бути проблемою. Напевно, спочатку було встановлено, що змінна $ TERM не була встановлена, про що інший користувач, Гуннар, згадував у своїй відповіді.
Сергій Колодяжний

1

Діалогове вікно помилок пов’язане з виправленням помилки # 678421 , тому я винен. ;) Він повідомляє про помилки через деякі команди в одному з ваших файлів конфігурації. Якщо прокрутити до вершини, ви побачите, який файл викликає повідомлення про помилку.

Можливо, відповіді Серга достатньо, щоб позбутися діалогового вікна попередження.

Редагувати:

Хочеться додати пару речей через оновлене запитання.

На відміну від раніше, /usr/sbin/lightdm-sessionзараз працює під bash (раніше sh). Ось чому його пошук ~/.profileпризводить до отримання ~/.profileджерел ~/.bashrc. Можливо, це означає, що зміст за замовчуванням ~/.profileповинно бути змінено.

Найлегше, що ви можете зробити, щоб виправити це, як ви запропонували, дзвонити tput лише у тому випадку, якщо встановлено $ TERM.


Я спробував перевірити, чи встановлено $ TERM, але, здається, це не працює.
Sildoreth

@Sildoreth: Ви можете, будь ласка, показати нам точний код для цього? (Будь ласка, відредагуйте своє запитання ще раз.)
Gunnar Hjalmarsson

додано до запитання
Sildoreth

@Sildoreth: Бачив. Можливо, це тому, що tput викликається в підпроцесах. (Лише здогадка.) У будь-якому випадку ви знайшли хороший спосіб впоратися з цим.
Gunnar Hjalmarsson
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.