Pertanyaannya mengatakan itu semua. Saat ini saya menggunakan Arch Linux dan zsh, tetapi saya ingin solusi yang (minimal) berfungsi baik pada VT dan xterms dan juga (mudah-mudahan, lebih disukai) akan terus bekerja jika saya beralih distro atau shell.
Saya telah mendengar jawaban yang sangat berbeda untuk pertanyaan ini di dokumen distro yang berbeda. Ubuntu mengatakan "gunakan .pam_environment". Saya pikir di Arch apa yang mereka rekomendasikan tergantung pada shell Anda. Saat ini saya meletakkan semuanya di. Profil dan jika shell tidak sumber itu untuk beberapa alasan (misalnya bash jika. Bash_profile ada), saya menimpanya dengan secara manual sumber itu. Tapi sepertinya harus ada cara yang lebih baik.
shell
environment-variables
login
strugee
sumber
sumber
Jawaban:
Sayangnya tidak ada lokasi sepenuhnya portabel untuk mengatur variabel lingkungan. Dua file yang paling dekat adalah
~/.profile
, yang merupakan lokasi tradisional dan bekerja di luar kotak pada banyak pengaturan, dan~/.pam_environment
, modern, biasa tapi alternatif yang terbatas.Apa yang dimasukkan
~/.pam_environment
File
~/.pam_environment
dibaca oleh semua metode login yang menggunakan PAM dan yang memiliki file ini diaktifkan. Ini mencakup sebagian besar sistem Linux saat ini.Keuntungan utama
~/.pam_environment
adalah bahwa (ketika diaktifkan) itu dibaca sebelum shell pengguna dimulai, jadi itu berfungsi terlepas dari jenis sesi, shell login dan kompleksitas lainnya. Ia bahkan berfungsi untuk login non-interaktif sepertisu -c somecommand
danssh somecommand
.Keterbatasan utama
~/.pam_environment
adalah bahwa Anda hanya dapat menempatkan tugas sederhana di sana, bukan sintaks shell kompleks. Sintaks dari file ini adalah sebagai berikut.export
dan satu ruang (bukan tab, gambar saja).VAR=VALUE
mana VAR terdiri dari huruf, angka, dan garis bawah.#
memulai komentar, tidak dapat muncul dalam nilai.'
atau"
dan berisi kutipan identik lainnya, maka VAR diatur ke string di antara kutipan (semuanya setelah kutipan kedua diabaikan). Kalau tidak, VAR diatur ke string setelah=
tanda.=
, variabel dihapus dari lingkungan.Jadi, terbalik,
~/.pam_environment
bekerja dalam berbagai keadaan. Pada sisi negatifnya, Anda tidak dapat memiliki pengaturan dinamis seperti mendasarkan nilai variabel pada variabel lain (misalnya menambahkan direktori ke PATH) atau menggunakan output dari perintah (mis. Tes apakah direktori atau program ada), dan beberapa karakter (#'"
, baris baru) tidak mungkin atau sulit untuk dimasukkan ke dalam nilai.Apa yang dimasukkan
~/.profile
File ini harus memiliki sintaks sh portabel (POSIX). Hanya gunakan ekstensi ksh atau bash (array
[[ … ]]
,, dll.) Jika Anda tahu bahwa sistem Anda memiliki shell ini sebagai/bin/sh
.File ini dapat dibaca oleh skrip dalam aplikasi otomatis, jadi tidak boleh memanggil program yang menghasilkan output atau panggilan apa pun
exec
. Jika Anda ingin melakukan itu pada login mode teks, lakukan hanya untuk shell interaktif. Contoh:Ini adalah contoh penggunaan
/bin/sh
sebagai shell login Anda dan beralih ke shell favorit Anda. Lihat juga bagaimana saya bisa menggunakan bash sebagai shell login saya ketika sysadmin saya menolak untuk membiarkan saya mengubahnyaKapan
~/.profile
tidak membaca login non-grafis?Shell login yang berbeda membaca file yang berbeda.
Jika shell login Anda adalah bash
Bash membaca
~/.bash_login
atau~/.bash_profile
jika ada, bukan~/.profile
. Juga bash tidak membaca~/.bashrc
di shell login bahkan jika itu interaktif. Agar tidak perlu lagi mengingat quirks ini, buat a~/.bash_profile
dengan dua baris berikut:Lihat juga File pengaturan mana yang harus digunakan untuk mengatur variabel lingkungan dengan bash?
Jika shell login Anda adalah zsh
Zsh membaca
~/.zprofile
dan~/.zlogin
, tetapi tidak~/.profile
. Zsh memiliki sintaks yang berbeda dari sh, tetapi dapat membaca~/.profile
dalam mode emulasi sh. Anda dapat menggunakan ini untuk~/.zprofile
:Lihat juga Zsh tidak memukul ~ /. Profil
Jika shell login Anda adalah beberapa shell lain
Tidak banyak yang dapat Anda lakukan di sana, singkat untuk digunakan
/bin/sh
sebagai shell login Anda dan shell favorit Anda (seperti ikan) sebagai shell interaktif saja. Itu yang saya lakukan dengan zsh. Lihat di atas untuk contoh meminta shell lain dari~/.profile
.Perintah jarak jauh
Saat menjalankan perintah jarak jauh tanpa melalui shell interaktif, tidak semua shell membaca file startup.
Ksh membaca file yang ditentukan oleh
ENV
variabel, jika Anda berhasil meneruskannya.Bash membaca
~/.bashrc
jika tidak interaktif (!) Dan proses induknya disebutrshd
atausshd
. Jadi Anda bisa mulai~/.bashrc
denganZsh selalu membaca
~/.zshenv
saat dimulai. Gunakan dengan hati-hati, karena ini dibaca oleh setiap instance zsh, bahkan ketika itu adalah subshell tempat Anda mengatur variabel lain. Jika zsh adalah shell login Anda dan Anda ingin menggunakannya untuk mengatur variabel hanya untuk perintah jarak jauh, gunakan pelindung: setel beberapa variabel~/.profile
, sepertiMY_ENVIRONMENT_HAS_BEEN_SET=yes
, dan periksa penjaga ini sebelum membaca~/.profile
.Kasus login grafis
Banyak distribusi, manajer tampilan, dan lingkungan desktop yang diatur untuk dijalankan
~/.profile
, baik dengan mengambilnya secara eksplisit dari skrip startup atau dengan menjalankan shell login.Sayangnya, tidak ada metode umum untuk menangani kombinasi distro / DM / DE di mana
~/.profile
tidak dibaca.Jika Anda menggunakan sesi tradisional yang dimulai oleh
~/.xsession
, ini adalah tempat di mana Anda harus mengatur variabel lingkungan Anda; lakukan dengan sumber~/.profile
(yaitu. ~/.profile
). Perhatikan bahwa dalam beberapa pengaturan, skrip startup lingkungan desktop akan sumber~/.profile
lagi.sumber
case $- in *i*)
harus dilakukan;;
atauesac
) jika$-
cocok dengan polanya*i*
, yaitu jika$-
berisii
, yaitu jika shell bersifat interaktif.$-
adalah serangkaian opsi shell yang saat ini ditetapkan. (sepertiset -x
).i
berarti shell interaktif.~/.config/env
, bahkan tanpa persaingan?.profile
kepatuhan saya dengan cangkang Bourne yang cukup tua, tetapi saya menyadari bahwa beberapa orang tidak peduli. Saya tidak membenci orang dengan anggapan bahwa sh = bash untuk file mereka sendiri, saya hanya peduli jika mereka menerbitkan#!/bin/sh
skrip yang menggunakan fitur bash.Sejauh yang saya tahu tidak ada distro dan shell standar agnostik bagaimana mengatur variabel lingkungan.
Standar yang paling umum dan de facto tampaknya
/etc/profile
dan~/.profile
. Tampaknya yang paling umum kedua adalah/etc/environment
dan~/.pam_environment
.Tampak bagi saya bahwa semua dokumentasi yang saya temukan juga sudah Anda temukan. Saya mendaftarkan mereka di sini untuk pembaca lain.
/etc/profile
dan~/.profile
( tautan )./etc/environment
dan~/.pam_environment
( tautan )./etc/profile
dan/etc/environment
( tautan ).Bonus: teks yang mempertanyakan penggunaan dan / atau penyalahgunaan
/etc/environment
dalam bahasa debian ( tautan , pembaruan terakhir 2008).sumber
sh
? Selama Anda tetap berpegang pada POSIX, saya akan berpikir Anda akan baik-baik saja ...csh
dan berteman dengan cara POSIX (Anda perlu sesuatu sepertiset
atausetenv
)Saya menambahkan skrip berikut ~ / bin / agnostic_setenv:
Dan di ~ / .perl-homedir saya menggunakan:
Skrip serupa untuk agnostic_unsetenv:
sumber