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 seperti su -c somecommand
dan ssh 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.
- File diurai baris demi baris.
- Ruang putih terkemuka diabaikan.
- Anda dapat secara opsional memulai garis dengan
export
dan satu ruang (bukan tab, gambar saja).
- Setelah itu, setiap baris harus memiliki bentuk di
VAR=VALUE
mana VAR terdiri dari huruf, angka, dan garis bawah.
#
memulai komentar, tidak dapat muncul dalam nilai.
- Jika VALUE dimulai dengan
'
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.
- Jika tidak ada
=
, 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:
case $- in *i*)
# Display a message if I have new mail
if mail -e; then echo 'You have new mail'; fi
# If zsh is available, and this looks like a text-mode login, run zsh
case "`ps $PPID` " in
*" login "*)
if type zsh >/dev/null 2>/dev/null; then exec zsh; fi;;
esac
esac
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 mengubahnya
Kapan ~/.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:
. ~/.profile
case $- in *i*) . ~/.bashrc;; esac
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
:
emulate sh -c '. ~/.profile'
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 disebut rshd
atau sshd
. Jadi Anda bisa mulai ~/.bashrc
dengan
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
Zsh 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
, seperti MY_ENVIRONMENT_HAS_BEEN_SET=yes
, dan periksa penjaga ini sebelum membaca ~/.profile
.
if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi
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.