Di mana variabel lingkungan TERM dapat diatur?

26

Ketika saya membuka jendela terminal dengan emulator Terminal GNOME di GUI desktop, variabel lingkungan TERM shell default ke nilai xterm.

Jika saya menggunakan CTL+ ALT+ F1untuk beralih ke jendela konsol TTY dan echo $TERMnilainya diatur ke linux.

Motivasi saya untuk bertanya adalah bahwa di dalam ~/.bashrcfile saya variabel digunakan untuk menentukan apakah shell warna disediakan atau hanya monokrom kuno yang baik.

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color) color_prompt=yes;;
esac

Di shell konsol dan shell emulator Gnome Terminal jika saya mengetik

export TERM=xterm-color
source /.bashrc

kedua kerang berubah menjadi mode warna (sesuatu yang saya ingin selalu terjadi di keduanya).

Di mana TERMnilai-nilai standar bisa ditetapkan, dan di mana tempat terbaik untuk mengubah standarnya, jika memungkinkan? Tampaknya tidak ada apa pun di terminal emulator GUI untuk memilih atau mengatur nilai TERM default.

Saya memang mempertimbangkan untuk hanya menambahkan baris export TERM=xterm-colorke bagian atas ~/.bashrcfile saya tetapi insting saya mengatakan ini bukan solusi terbaik dan pencarian Google saya belum membawa saya ke jawaban yang baik.

Saya menjalankan Ubuntu 15.04 Desktop Edition (Berbasis Debian).

Andy Fusniak
sumber

Jawaban:

17

Di banyak tempat, tergantung

Pada terminal virtual dan terminal nyata, TERMvariabel lingkungan diatur oleh program yang terhubung login, dan diwarisi sepanjang jalan ke shell interaktif yang dijalankan setelah seseorang telah logon. Di mana, tepatnya, ini terjadi bervariasi dari satu sistem ke sistem, dan sesuai dengan jenis terminal.

Jenis nyata, serial, terminal dapat bervariasi, sesuai dengan apa yang ada di ujung kabel. Jadi secara konvensional gettyprogram dipanggil dengan argumen yang menentukan jenis terminal, atau melewati TERMprogram dari data konfigurasi layanan manajer layanan.

  • Pada initsistem van Smoorenburg , orang dapat melihat ini dalam /etc/inittabentri, yang akan membaca sesuatu di sepanjang baris

    S0: 3: respawn: / sbin / agetty ttyS0 9600 vt100-nav
    Argumen terakhir agettypada baris itu vt100-nav,, adalah tipe terminal yang ditetapkan untuk /dev/ttyS0. Demikian /etc/inittabjuga tempat untuk mengubah jenis terminal untuk terminal nyata pada sistem tersebut.
  • Pada sistem systemd, seseorang dapat melihat ini di /usr/lib/systemd/system/[email protected]file unit ( /lib/systemd/system/[email protected]pada sistem yang tidak digabungkan), yang berbunyi

    Lingkungan = JANGKA = vt100
    pengaturan TERMvariabel dalam lingkungan yang dilewatkan ke agetty. File unit layanan ini adalah tempat untuk mengubah jenis terminal untuk terminal nyata pada sistem tersebut. Perhatikan bahwa ini berlaku untuk semua terminal nyata yang menggunakan templat unit layanan ini. (Untuk mengubahnya hanya terminal individu, seseorang harus secara manual instantiate template.)
  • Pada BSD, initambil tipe terminal dari bidang ketiga dari setiap entri terminal di /etc/ttysdatabase, dan set TERMdari yang ada di lingkungan yang dijalankannya getty. Demikian /etc/ttysjuga di mana seseorang mengubah jenis terminal untuk terminal nyata pada BSD.

Terminal virtual kernel, seperti yang telah Anda catat, memiliki tipe tetap. Tidak seperti NetBSD, yang dapat memvariasikan jenis terminal virtual kernel dengan cepat, Linux dan BSD lainnya memiliki satu jenis terminal tetap yang diimplementasikan dalam program emulasi terminal bawaan kernel. Di Linux, tipe itu cocok linuxdengan basis data terminfo. (Emulasi terminal kernel FreeBSD adalah xtermsubset terbatas sejak versi 9.)

  • Pada sistem yang menggunakan mingettyatau vc-get-tty(dari paket nosh) program "tahu" bahwa ia hanya dapat berbicara dengan terminal virtual, dan mereka menghubungkan jenis terminal virtual "dikenal" yang sesuai dengan sistem operasi yang dikompilasi untuk program tersebut.
  • Pada sistem systemd, seseorang dapat melihat ini di /usr/lib/systemd/system/[email protected]file unit ( /lib/systemd/system/[email protected]pada sistem yang tidak digabungkan), yang berbunyi

    Lingkungan = JANGKA = linux
    pengaturan TERMvariabel dalam lingkungan yang dilewatkan ke agetty.

Untuk terminal virtual kernel, seseorang tidak mengubah tipe terminal. Program emulator terminal di kernel tidak berubah. Tidak benar untuk mengubah jenisnya. Secara khusus, ini akan mengacaukan pengenalan urutan CSI kursor / pengeditan. The linuxurutan CSI dikirim oleh Linux kernel terminal emulator yang berbeda dengan xtermatau vt100urutan CSI dikirim oleh GUI program emulator terminal dalam mode Desember VT.

Emulator terminal GUI Anda adalah salah satu dari banyak program, mulai dari perintah SSH hingga screen, yang menggunakan pseudo-terminal. Apa tipe terminal tergantung dari program emulator terminal apa yang berjalan di sisi master terminal semu, dan bagaimana hal itu dikonfigurasikan. Kebanyakan emulator terminal GUI akan memulai program di sisi slave dengan TERMvariabel yang nilainya cocok dengan emulasi terminal mereka di sisi master. Program seperti server SSH akan berusaha "melewati" jenis terminal yang ada di ujung koneksi klien. Biasanya ada beberapa menu atau opsi konfigurasi untuk memilih di antara emulasi terminal.

Tangan yang mencengkeram

Cara yang tepat untuk mendeteksi kapabilitas warna bukanlah dengan memasang daftar jenis terminal di skrip Anda. Ada banyak sekali jenis terminal yang mendukung warna.

Cara yang benar adalah dengan melihat apa yang termcap / terminfo katakan tentang tipe terminal Anda.

warna = 0
jika tput Co> / dev / null 2> & 1
kemudian
    test "` tput Co` "-gt 2 && color = 1
warna tif elif> / dev / null 2> & 1
kemudian
    test "` tput colors` "-gt 2 && color = 1
fi

Bacaan lebih lanjut

  • Jonathan de Boyne Pollard (2018). TERM. Panduan nosh . Perangkat lunak.
JdeBP
sumber
Berikut ini ada di .bashrc default Debian jessie: [ -x /usr/bin/tput ] && /usr/bin/tput setaf 1 >&/dev/null && color_prompt=yes. (ncurses 5.9)
thom_nic
2
Juga tput Comengembalikan "kapabilitas terminfo yang tidak diketahui" di Jessie dan Xenial. tput colorsdan tput setaf 1keduanya tampaknya bekerja meskipun saya akui saya tidak mengerti mengapa .
thom_nic
2

Silakan lihat /ubuntu//a/614714/398785 untuk jawaban terperinci saya tentang mengapa menurut saya TERM=xterm-colorpendekatan yang salah dan Ubuntu .bashrcsudah usang. Saya sarankan Anda menggunakan TERM=xterm-256color(yang merupakan default sejak gnome-terminal 3.16, tetapi juga aman untuk digunakan dengan gnome-terminal yang lebih lama), dan sesuaikan dengan itu .bashrc.

egmont
sumber
1
+1 untuk tautan Anda. Saran kecil; kalimat berikut mungkin membingungkan (saya pertama kali mendapat kesan bahwa Anda mengatakan bahwa menggunakan .bashrcsudah usang). ".Bashrc Ubuntu sudah usang."
IsaacS
@IsaacS Apakah Anda punya saran bagaimana memperbaikinya? Misalnya akan mengganti "usang" dengan "usang" bantuan?
egmont
1
Tampaknya xterm-256colormenyebabkan htoptata letak yang berantakan seperti ini di Ubuntu 18.04.
Stop Harming Monica
@OrangeDog Di terminal emulator mana? Pertanyaan ini di sini dan karenanya tanggapan saya berfokus pada Terminal GNOME, sedangkan halaman yang Anda tautkan menunjukkan Konsole. Bugnya terlihat seperti terminal emulator belum mendukung urutan pelarian REP yang mulai digunakan ncurses sekitar waktu itu. VTE (Terminal GNOME) telah menambahkan dukungan untuknya di Ubuntu 18.04, kemungkinan Konsole tidak. Saya menduga bahwa komentar Anda dengan kerusakan htop berlaku untuk Konsole tetapi tidak untuk Terminal GNOME.
egmont
@egmont tidak dapat berbicara untuk masalah aslinya, tapi saya mendapatkan hasil yang sama dengan terminal WSL (apa pun itu).
Stop Harming Monica