GNU/Linux >> Belajar Linux >  >> Linux

Di mana Default Variabel Lingkungan Istilah Ditetapkan?

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 +F1 untuk beralih ke jendela TTY konsol dan echo $TERM nilainya diatur ke linux .

Motivasi saya untuk bertanya adalah bahwa di dalam ~/.bashrc my saya file variabel digunakan untuk menentukan apakah shell warna disediakan atau hanya monokrom kuno yang bagus.

# 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 Terminal Gnome jika saya mengetik

export TERM=xterm-color
source /.bashrc

kedua cangkang berubah ke mode warna (sesuatu yang saya ingin selalu terjadi di keduanya).

Dimana default TERM tolong atur nilainya dan di mana tempat terbaik untuk mengubah defaultnya, jika memungkinkan? Tampaknya tidak ada apa pun di GUI terminal emulator untuk memilih atau menyetel nilai TERM default.

Saya memang mempertimbangkan untuk menambahkan baris export TERM=xterm-color ke bagian atas ~/.bashrc saya file tapi 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).

Jawaban yang Diterima:

Di banyak tempat, tergantung

Pada terminal virtual dan terminal nyata, TERM variabel lingkungan diatur oleh program yang berantai ke login , dan diwarisi sepanjang jalan ke shell interaktif yang dijalankan setelah seseorang masuk. Di mana tepatnya, hal ini terjadi bervariasi dari satu sistem ke sistem lainnya, dan sesuai dengan jenis terminalnya.

terminal nyata

Terminal nyata, serial, dapat bervariasi dalam jenis, sesuai dengan apa yang ada di ujung kabel yang lain. Jadi secara konvensional getty program dipanggil dengan argumen yang menentukan tipe terminal, atau diteruskan TERM program dari data konfigurasi layanan manajer layanan.

  • Di van Smoorenburg init sistem, orang dapat melihat ini di /etc/inittab entri, yang akan membaca sesuatu di sepanjang baris

    S0:3:respawn:/sbin/agetty ttyS0 9600 vt100-nav

    Argumen terakhir untuk agetty di baris itu, vt100-nav , adalah tipe terminal yang disetel untuk /dev/ttyS0 . Jadi /etc/inittab adalah tempat untuk mengubah jenis terminal untuk terminal nyata pada sistem seperti itu.

  • Pada sistem systemd, dulu dapat melihat ini di /usr/lib/systemd/system/[email protected] file unit (/lib/systemd/system/[email protected] pada sistem yang tidak digabungkan), yang biasa membaca

    Environment=TERM=vt100

    menyetel TERM variabel di lingkungan diteruskan ke agetty .

  • Pada BSD, init mengambil jenis terminal dari bidang ketiga dari setiap entri terminal di /etc/ttys database, dan set TERM dari lingkungan yang menjalankan getty dengan. Jadi /etc/ttys adalah tempat seseorang mengubah tipe terminal untuk terminal nyata pada BSD.

variabilitas systemd

[email protected] file unit layanan, atau file drop-in yang berlaku padanya, adalah tempat untuk mengubah jenis terminal untuk terminal nyata pada sistem systemd. Perhatikan bahwa perubahan seperti itu berlaku untuk semua layanan login terminal yang menggunakan templat unit layanan ini. (Untuk mengubahnya hanya untuk masing-masing terminal, kita harus membuat template secara manual, atau menambahkan drop-in yang hanya berlaku untuk instantiasi.)

systemd memiliki setidaknya empat mekanisme selama masa pakainya untuk mengambil nilai TERM variabel lingkungan. Pada saat pertama kali menulis jawaban ini, seperti yang dapat dilihat, ada Environment=TERM=something baris dalam file unit layanan template. Di lain waktu, jenis linux dan vt102 terprogram ke dalam getty dan serial-getty file unit layanan masing-masing. Baru-baru ini, variabel lingkungan telah diwarisi dari proses #1, yang telah mengaturnya dengan berbagai cara.

Mulai tahun 2020, cara systemd memutuskan jenis terminal apa yang akan ditentukan dalam TERM layanan variabel lingkungan cukup kompleks, dan tidak didokumentasikan sama sekali. Cara mengubahnya tetap pada file konfigurasi drop-in dengan Environment=TERM=something . Tapi dari mana nilai default berasal cukup bervariasi. Tunduk pada beberapa aturan yang cukup rumit untuk menjelaskan yang melibatkan TTYPath= pengaturan unit layanan individual, ini dapat berupa salah satu dari tiga nilai:linux . bawaan , sebuah vt220 . bawaan (tidak lagi vt102 ), atau nilai TERM variabel lingkungan yang diwarisi proses #1, biasanya dari pemuat kernel/bootstrap.

(Ironisnya, getttyent() mekanisme masih ada di pustaka GNU C, dan systemd dapat menggunakan kembali /etc/ttys mekanisme.)

terminal virtual kernel

Terminal virtual kernel, seperti yang telah Anda catat, memiliki tipe yang 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, jenis itu cocok dengan linux dari database terminfo. (Emulasi terminal kernel FreeBSD sejak versi 9 telah teken . Sebelum versi 9 adalah cons25 OpenBSD adalah pccon .)

  • Pada sistem yang menggunakan mingetty atau vc-get-tty (dari paket nosh) program “tahu” bahwa ia hanya dapat berbicara dengan terminal virtual, dan mereka memasangkan tipe terminal virtual “yang dikenal” yang sesuai dengan sistem operasi tempat program dikompilasi.
  • Pada sistem systemd, dulu dapat melihat ini di /usr/lib/systemd/system/[email protected] file unit (/lib/systemd/system/[email protected] pada sistem yang tidak digabungkan), yang berbunyi

    Environment=TERM=linux

    menyetel TERM variabel di lingkungan diteruskan ke agetty .

Untuk terminal virtual kernel, satu tidak mengubah jenis terminal. Program emulator terminal di kernel tidak berubah. Itu salah untuk mengubah jenis. Secara khusus, ini akan mengacaukan pengenalan urutan CSI kunci kursor/editing. linux Urutan CSI yang dikirim oleh emulator terminal kernel Linux berbeda dengan xterm atau vt100 Urutan CSI yang dikirim oleh program emulator terminal GUI dalam mode DEC VT. (Faktanya, mereka sangat istimewa dan non-standar, dan berbeda baik untuk semua terminal nyata yang saya tahu, dan hampir semua emulator terminal perangkat lunak lain selain dari yang dibangun ke dalam Linux.)

Emulator terminal GUI

Emulator terminal GUI Anda adalah salah satu dari banyak program, dari demon SSH hingga screen , yang menggunakan terminal semu. Jenis terminal tergantung dari program emulator terminal apa yang berjalan di sisi master terminal semu, dan bagaimana konfigurasinya. Kebanyakan emulator terminal GUI akan memulai program di sisi slave dengan TERM variabel yang nilainya cocok dengan emulasi terminalnya di sisi master. Program seperti server SSH akan mencoba untuk "melewati" jenis terminal yang ada di ujung klien koneksi. Biasanya ada beberapa menu atau opsi konfigurasi untuk dipilih di antara emulasi terminal.

Tangan yang mencengkeram

Cara yang tepat untuk mendeteksi kemampuan warna adalah tidak untuk memasang daftar tipe terminal dalam skrip Anda. Ada banyak sekali jenis terminal yang mendukung warna.

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

colour=0
if tput Co > /dev/null 2>&1
then
    test "`tput Co`" -gt 2 && colour=1
elif tput colors > /dev/null 2>&1
then
    test "`tput colors`" -gt 2 && colour=1
fi

Bacaan lebih lanjut

  • Jonathan de Boyne Pollard (2018). TERM . Panduan nosh . Perangkat Lunak.

Linux
  1. Cara mengatur terminal default (atau window manager, browser, dan banyak lagi) di Linux

  2. Bagaimana Cara Menentukan Dari Mana Variabel Lingkungan Berasal?

  3. Setel +a Tidak Hapus Bendera -a?

  1. Bagaimana cara mengubah bahasa git saya?

  2. Di mana set variabel lingkungan $HOME?

  3. Cara mengatur gateway Default

  1. Bagaimana Cara Mengatur Variabel Lingkungan Pada Baris Perintah Dan Membuatnya Muncul Dalam Perintah?

  2. Di mana tampilan terminal tty7

  3. Apa cara terbaik untuk mengatur variabel lingkungan di .bashrc?