Pengaturan lingkungan yang benar

15

Saya menggunakan zsh dan gdm untuk menjalankan gnome. Beberapa waktu lalu saya menemukan bahwa variabel tidak diatur dengan benar. Misalnya LANG / LC_ALL tidak benar ( ""bukan en_GB.UTF-8).

Saya membagi .zshrcmenjadi .zshrcdan .profile. Dalam yang terakhir saya mengatur variabel lingkungan, tetapi bagaimana saya bisa mengatur variabel sebelum sesi dimulai? Saya mencoba beberapa pilihan ( .xinitrc, .xsessionrc) tetapi tidak ada yang berhasil.

Sunting Untuk memperjelas - Saya menggunakan .profiledan secara manual mengambilnya .zshrc. Itu tidak mengubah pertanyaan.

Maciej Piechotka
sumber
Apakah Anda .profiletidak dimuat sama sekali, atau ada sesuatu yang menimpa variabel lokal? (Coba tetapkan beberapa variabel lain seperti export MACIEJ_PROFILE=yesmemastikan. set -xDi .profiledapat menjadi cara yang baik untuk memeriksa apa yang sedang dieksekusi dalam dan setelah .profile, jika itu dibaca sama sekali.) Tidak ada gunanya dalam sumber .profiledari .zshrc.
Gilles 'SO- stop being evil'
Apakah ini masalah di terminal windows atau di tempat lain? Apakah Anda mendapatkan pengaturan lokal yang Anda inginkan saat menjalankan ssh localhost zsh? Bagaimana dengan ssh localhost bash? Jika bash baik-baik saja tetapi tidak zsh, mungkin Anda memasukkan sesuatu /etc/zshenvatau ~/.zshenv(yang hampir selalu merupakan ide yang buruk).
Gilles 'SO- berhenti bersikap jahat'
Tidak ada shell yang berfungsi baik (sebelum dan sesudah split). Masalahnya adalah bahwa gnome-sessiontidak memiliki set variabel ini.
Maciej Piechotka

Jawaban:

21

Cara sederhananya adalah menciptakan mesin waktu, mengunjungi berbagai orang yang merancang file startup shell dan menyuruh mereka untuk membedakan antara tiga hal:

  • pengaturan sesi, misalnya variabel lingkungan;
  • peluncuran sesi, misalnya, misalnya memulai shell baris perintah atau manajer jendela atau menjalankan startx;
  • inisialisasi shell, misalnya alias, prompt, binding kunci.

Tidak terlalu sulit untuk mendapatkan sesi vs shell dengan cara yang portabel: inisialisasi waktu masuk masuk ke .profile(atau .zprofile, .login), inisialisasi shell masuk .bashrcatau .zshrc. Saya sebelumnya telah menulis tentang .bash_profile, zsh vs shell lainnya , lebih banyak tentang portabilitas (kebanyakan tentang bash) , lebih banyak tentang siapa yang membaca.profile .

Masalah yang tersisa adalah membedakan antara pengaturan sesi dan peluncuran sesi. Dalam kebanyakan kasus, ~/.profiledieksekusi ketika Anda masuk dan dapat menggandakan keduanya, tetapi ada pengecualian:

  • Jika shell login Anda adalah (t) csh atau zsh, ~/.logindan ~/.zprofilebukan bersumber ~/.profile. Ditto untuk bash dan ~/.bash_profile, tapi ini mudah diselesaikan dengan sumber ~/.profiledari ~/.bash_profile.
  • Jika Anda masuk di bawah manajer tampilan (xdm, gdm, kdm, ...), apakah Anda ~/.profilemembaca tergantung pada versi program, pada distribusi Anda (Linux atau yang lain), dan pada tipe sesi apa yang Anda pilih.
    • Jika Anda mengandalkan manajer tampilan untuk memulai sesi untuk Anda, Anda .profileharus mengatur variabel lingkungan tetapi tidak memulai sesi (misalnya manajer jendela).
    • File konfigurasi tradisional untuk sesi X adalah ~/.xsession, melakukan pengaturan sesi dan peluncuran sesi. Jadi file tersebut pada dasarnya . ~/.xsession; . ~/.xinitrc. Beberapa sumber distribusi ~/.profilesebelumnya ~/.xsession. Sumber distribusi modern hanya ~/.xsessionketika Anda memilih sesi "kustom" dari manajer tampilan, dan sesi seperti itu tidak selalu tersedia.
    • Manajer sesi Anda mungkin memiliki cara sendiri untuk mengatur variabel lingkungan. (Itu adalah bagian opsional dari lingkungan desktop Anda, yang dipilih oleh Anda melalui file konfigurasi atau dengan memilih jenis sesi saat masuk; jangan bingung dengan skrip startup sesi yang disediakan oleh manajer tampilan, yang dieksekusi di bawah pengguna Anda tetapi dipilih berdasarkan sistem. Ya, ini berantakan.)

Singkatnya, ~/.profileadalah tempat yang tepat untuk variabel lingkungan. Jika tidak dibaca, coba sumber dari ~/.xsession(dan mulai program X Anda dari sana), atau cari metode khusus sistem (yang mungkin tergantung pada distribusi Anda, manajer tampilan jika ada, jenis sesi jika manajer tampilan, dan lingkungan desktop atau manajer sesi).

Gilles 'SO- berhenti menjadi jahat'
sumber
.xsessionadalah file yang saya cari.
Maciej Piechotka
1
Saya sangat setuju dengan semuanya kecuali ringkasan Anda. Saya tidak berpikir Anda menetapkan poin ini. Jika .profilesumber Anda .bashrcatau yang serupa, maka Anda dapat dengan andal mengatur variabel lingkungan .bashrcuntuk tidak hanya sesi login, tetapi untuk shell baru yang memerlukan pengaturan berbeda, misalnya jika Anda memulai xtermdari gnome-terminaldan ingin berbeda dircolors.
Mikel
@Mikel Jika Anda mengatur variabel lingkungan .bashrc, mereka akan menimpa pengaturan Anda sebelumnya. Misalnya, jika Anda telah memulai instance Screen atau Tmux dengan variabel lingkungan tertentu, apa pun yang Anda setel .bashrcakan menimpa pengaturan ini. LS_COLORSadalah kasus khusus karena ini benar-benar pengaturan per terminal; idealnya itu harus diatur oleh terminal emulator, dan pengaturannya dalam file shell rc adalah solusi terbaik.
Gilles 'SO- berhenti bersikap jahat'
1

Dalam dokumentasi Gentoo ada artikel Panduan Pelokalan Gentoo Linux . Bab 3 adalah tentang pengaturan lokal.

Sebagian besar pengguna biasanya hanya mengatur variabel LANG pada basis global. Contoh ini untuk lokal Jerman unicode:

Daftar Kode 3.1: Mengatur lokal sistem default /etc/env.d/02locale

LANG="en_GB.UTF-8"

Di Gentoo saya LANGdiatur dalam file ini dan semuanya berfungsi dengan baik ...

pbm@tauri ~ $ cat /etc/env.d/02locale 
LANG="pl_PL.UTF-8"

pbm@tauri ~ $ locale
LANG=pl_PL.UTF-8
LC_CTYPE="pl_PL.UTF-8"
LC_NUMERIC="pl_PL.UTF-8"
LC_TIME="pl_PL.UTF-8"
LC_COLLATE="pl_PL.UTF-8"
LC_MONETARY="pl_PL.UTF-8"
LC_MESSAGES="pl_PL.UTF-8"
LC_PAPER="pl_PL.UTF-8"
LC_NAME="pl_PL.UTF-8"
LC_ADDRESS="pl_PL.UTF-8"
LC_TELEPHONE="pl_PL.UTF-8"
LC_MEASUREMENT="pl_PL.UTF-8"
LC_IDENTIFICATION="pl_PL.UTF-8"
LC_ALL=
pbm
sumber
Berhati-hatilah karena bagian yang Anda kutip ok, tetapi panduan ini juga merekomendasikan pengaturan variabel lingkungan .bashrc, yang salah (lihat jawaban saya dan khususnya superuser.com/questions/217431 ).
Gilles 'SO- stop being evil'
Terima kasih untuk info yang begitu terperinci ... :) Saya tidak pernah menggunakan bagian .bashrc - pengaturan di env.dlebih universal.
pbm
Juga per sistem, bukan per pengguna. Saya lebih suka memisahkan pengaturan sistem dari pengaturan pengguna.
Maciej Piechotka