Tidak ada nilai untuk $ TERM dan tidak ditentukan -T

22

Saya baru-baru ini meningkatkan (dengan apt-get dist-upgrade) kotak Kubuntu dan Lubuntu Linux saya, dan sekarang setiap kali saya masuk ke salah satu mesin ini, saya mendapatkan pesan ini:

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

Ini adalah tangkapan layar dari pesan yang tepat: tput: Tidak ada nilai untuk $ TERM dan tidak ditentukan -T

Ini terjadi pada mesin Lubuntu saya dan mesin Kubuntu, dan itu tidak masalah sampai setelah saya memutakhirkan; jadi saya curiga itu bukan kesalahan pengguna.

Bagaimana saya bisa memperbaikinya?

MEMPERBARUI

Saya telah melacak ini ke file .bashrc saya, yang dipanggil oleh file .profile saya. Padahal, fakta bahwa file .bashrc saya sekarang berjalan ketika saya melakukan login GUI padahal tidak sebelum saya upgrade agak aneh. Dan tidak, saya belum mengubah file .bashrc saya atau .profile saya baru-baru ini. Juga, bash bukan shell default saya.

Masalahnya adalah bahwa saya memanggil tputfile .bashrc saya untuk mengatur variabel untuk digunakan dalam menambahkan warna ke prompt. Tetapi pada saat (tidak pantas) saat file .bashrc saya dijalankan, $TERMbelum disetel.

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)

Pertanyaan yang diperbarui: Bagaimana saya harus memperbaikinya? Haruskah saya mengatur $TERMdiri saya sendiri? Atau haruskah saya tidak mengatur variabel-variabel ini jika $TERMtidak disetel?

PEMBARUAN 2

Satu solusi yang saya coba adalah memeriksa apakah $TERMsudah disetel. Tapi ini sepertinya tidak berhasil; Saya masih mendapat pesan kesalahan yang sama. Ini kodenya:

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

Jadi tampaknya $TERM sudah diatur, tetapi tputmasih menyimpulkan itu tidak.

Sildoreth
sumber
1
Jika saya tidak salah .profileberjalan terlepas dari shell default
Sergiy Kolodyazhnyy
@Serg tetapi selama login shell GUI? Juga, saya tidak selalu melihat masalah ini.
Sildoreth
Yah, ya, itu harus dijalankan pada saat pengguna log in dan ini adalah persis apa yang Anda lakukan
Sergiy Kolodyazhnyy

Jawaban:

13

Apa yang akhirnya berhasil bagi saya adalah untuk memeriksa apakah shell itu shell interaktif. Saya mendasarkan solusi pada posting lain ini di unix.stackexchange: Cara memeriksa apakah shell masuk / interaktif / batch .

Jadi kode untuk solusinya adalah:

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
sumber
Aha, itu solusi yang elegan. :)
Gunnar Hjalmarsson
2
Jika ini masuk .bashrc, saya merasa mengejutkan. Defaultnya .bashrcberisi:, # If not running interactively, don't do anything case $- in *i*) ;; *) return;;jadi pengaturan Anda tidak boleh diterapkan kecuali interaktif.
muru
@muru File .bashrc saya sangat tidak standar. :)
Sildoreth
Tapi dimana kamu melakukan itu? di .bashrc?
jjmerelo
Saya pikir jika Anda meletakkan ini di bagian atas file Anda lebih bersih: [[ $- == *i* ]] || returnRef: ( askubuntu.com/a/1070182/362122 )
Klik
9

Jika kamu melakukan ini

if tty -s
then
    : # your tput commands
fi

Ini akan memperbaiki masalah Anda. Tanpa opsi -s tty akan menampilkan tty Anda atau menulis "not a tty"

Robert Jacobs
sumber
Deskripsi ttydari yang halaman pengguna adalah "mencetak nama file dari terminal terhubung ke input standar." Jika stdin dari skrip Anda adalah sebuah pipa, tes ini akan gagal, dengan konsekuensi program Anda berhenti mencetak warna dalam outputnya hanya karena inputnya berasal dari sebuah pipa. Mungkin test -t 1(dalam bahasa Inggris: "apakah stdout terhubung ke terminal?") Adalah apa yang Anda inginkan? Dengan cara itu Anda mendapatkan warna hanya jika output pergi ke terminal, dan Anda tidak akan melihat kode terminal aneh jika Anda mengarahkan outputnya ke file atau pipa melalui, katakanlah less,.
TheDudeAbides
6

Bagi saya, menambahkan

export TERM=xterm

untuk /etc/profilesatu-satunya hal yang memecahkan masalah. Sebenarnya, kesalahan memberi kami petunjuk:No value for $TERM

jjmerelo
sumber
4

[ Skenario berbeda, tapi mesin pencari membawaku ke sini dulu]

Ketika " tput: Tidak ada nilai untuk $ TERM dan tidak ditentukan -T " kesalahan terjadi dalam wadah Docker (bagi saya, ketika membuka panggilan shell zshdocker exec -it <container> zsh (-i untuk interaktif)) satu-satunya cara untuk memperbaikinya, adalah dengan mengatur variabel seperti ENV TERM xterm-256colordi Dockerfile untuk gambar ini.

Pendekatan suka RUN export TERM=xterm-256color atau RUN echo "export TERM=xterm-256color" >> ~/.zshrctidak berhasil. Nilai lain untuk JANGKA juga dimungkinkan.

mga0
sumber
3

Coba buka terminal (tidak masalah yang mana, bahkan tty1 akan melakukannya) dan jalankan baris ini

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

Anda akan diberikan pilihan emulator terminal default untuk x window. Pilih satu dengan memilih nomor, dan reboot setelah selesai.

$ sudo update-alternative --config x-terminal-emulator
Ada 6 pilihan untuk alternatif x-terminal-emulator (menyediakan / 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
sumber
Ketika saya mencoba ini, ia memberi tahu saya "Hanya ada satu alternatif di grup tautan x-terminal-emulator [...] Tidak ada yang perlu dikonfigurasi". Ini ada di mesin Kubuntu saya.
Sildoreth
Coba instal terminal emulator lain, misalnya gnome-terminalatausakura
Sergiy Kolodyazhnyy
Saya memiliki masalah yang persis sama. Saya sudah memilih sakura. Namun, ini tampaknya menjadi masalah dengan pembungkus terminal gnome; jika demikian, mengapa tidak memperbaikinya?
jjmerelo
Itu tidak memperbaiki masalah, sebenarnya.
jjmerelo
2
@jjmerelo Ketika OP kemudian mengungkapkan dalam jawabannya, ia memiliki baris dalam file .bashrc-nya, yang memberikan kesalahan. Pembungkus terminal Gnome seharusnya tidak menjadi masalah. Dugaan saya awalnya adalah bahwa variabel $ JANGKA belum disetel, yang merupakan pengguna lain, Gunnar, yang disebutkan dalam jawabannya.
Sergiy Kolodyazhnyy
1

Dialog kesalahan ini disebabkan oleh perbaikan bug # 678421 , jadi ini salah saya. ;) Ini memberi tahu Anda tentang kesalahan karena beberapa perintah di salah satu file konfigurasi Anda. Jika Anda menggulir ke atas, Anda dapat melihat file mana yang menyebabkan pesan kesalahan.

Kemungkinan jawaban Serg cukup untuk menyingkirkan dialog peringatan.

Edit:

Ingin menambahkan beberapa hal karena pertanyaan yang diperbarui.

Tidak seperti sebelumnya, /usr/sbin/lightdm-sessionsekarang dijalankan di bawah bash (sebelumnya sh). Itu sebabnya sumbernya ~/.profilehasil dalam ~/.profilesumber ~/.bashrc. Mungkin ini berarti bahwa konten default ~/.profileharus diubah.

Hal termudah yang dapat Anda lakukan untuk memperbaikinya adalah, seperti yang Anda sarankan, untuk hanya memanggil tput jika $ TERM sudah disetel.

Gunnar Hjalmarsson
sumber
Saya mencoba memeriksa apakah $ TERM sudah ditetapkan, tetapi sepertinya tidak berhasil.
Sildoreth
@ Sildoreth: Bisakah Anda menunjukkan kepada kami kode yang tepat untuk melakukannya? (Harap edit kembali pertanyaan Anda.)
Gunnar Hjalmarsson
ditambahkan ke pertanyaan
Sildoreth
@ Sildoreth: Melihatnya. Mungkin itu karena tput disebut dalam subproses. (Tebakan saja.) Bagaimanapun, Anda menemukan cara yang bagus untuk menghadapinya.
Gunnar Hjalmarsson