Pertanyaannya mengatakan itu semua. Saat ini saya menggunakan Arch Linux dan zsh, tetapi saya ingin solusi yang (minimal) berfungsi baik di VT maupun di xterms dan juga (semoga, lebih disukai) akan terus berfungsi jika saya mengganti 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 .profile dan jika shell tidak menyediakannya karena alasan tertentu (mis. bash jika .bash_profile ada), saya menimpanya dengan mengambilnya secara manual. Tapi sepertinya harus ada cara yang lebih baik.
Jawaban yang Diterima:
Sayangnya tidak ada lokasi yang sepenuhnya portabel untuk mengatur variabel lingkungan. Dua file yang paling dekat adalah ~/.profile
, yang merupakan lokasi tradisional dan berfungsi dengan baik di banyak penyiapan, dan ~/.pam_environment
, alternatif yang modern, biasa tetapi terbatas.
Apa yang harus dimasukkan ke dalam ~/.pam_environment
File ~/.pam_environment
dibaca oleh semua metode login yang menggunakan PAM dan yang mengaktifkan file ini. Ini mencakup sebagian besar sistem Linux saat ini.
Keuntungan utama ~/.pam_environment
adalah bahwa (bila diaktifkan) dibaca sebelum shell pengguna dimulai, sehingga berfungsi terlepas dari jenis sesi, shell login, dan kerumitan lainnya. Ia bahkan bekerja untuk login non-interaktif seperti su -c somecommand
dan ssh somecommand
.
Batasan utama ~/.pam_environment
adalah Anda hanya dapat meletakkan tugas sederhana di sana, bukan sintaksis shell yang rumit. Sintaks file ini adalah sebagai berikut.
- File diurai baris demi baris.
- Setiap baris harus memiliki bentuk
VAR=VALUE
di mana VAR terdiri dari huruf, angka, dan garis bawah. Bentuk alternatifVAR DEFAULT=value
memungkinkan perluasan variabel lingkungan menggunakan${VAR}
sintaks dan variabel khusus@{HOME}
dan@{SHELL}
. #
memulai komentar, itu tidak dapat muncul dalam nilai.- Jika VALUE dikelilingi oleh
"
, lalu VAR disetel ke string di antara tanda kutip. $
atau@
masukkan$
liter literal atau@
dan antrean panjang dapat dipisahkan dengan keluar dari baris baru dengan.
- Jika ada kesalahan sintaks seperti tidak ada
=
atau spasi putih tanpa tanda kutip, variabel akan dihapus dari lingkungan.
Jadi sisi baiknya, ~/.pam_environment
bekerja dalam berbagai macam keadaan. Pada sisi negatifnya, Anda tidak dapat menggunakan output dari suatu perintah (misalnya menguji apakah ada direktori atau program), dan beberapa karakter (#"
, baris baru) tidak mungkin atau sulit untuk dimasukkan ke dalam nilai.
Apa yang harus dimasukkan ke dalam ~/.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, sehingga tidak boleh memanggil program yang menghasilkan output apa pun atau memanggil exec
. Jika Anda ingin melakukannya 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 terbaca pada 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
dalam shell login meskipun interaktif. Agar tidak perlu mengingat kebiasaan ini lagi, buat ~/.bash_profile
dengan dua baris berikut:
. ~/.profile
case $- in *i*) . ~/.bashrc;; esac
Jika shell login Anda adalah zsh
Zsh membaca ~/.zprofile
dan ~/.zlogin
, tapi bukan ~/.profile
. Zsh memiliki sintaks yang berbeda dari sh, tetapi dapat membaca ~/.profile
dalam mode emulasi sh. Anda dapat menggunakan ini untuk ~/.zprofile
. Anda :
emulate sh -c '. ~/.profile'
Jika shell login Anda adalah shell lain
Tidak banyak yang dapat Anda lakukan di sana, selain menggunakan /bin/sh
sebagai shell login Anda dan shell favorit Anda (seperti ikan) sebagai shell interaktif saja. Itulah yang saya lakukan dengan zsh. Lihat di atas untuk contoh memanggil 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 melewatinya.
Bash membaca ~/.bashrc
jika tidak interaktif (!) dan proses induknya disebut rshd
atau sshd
. Jadi Anda dapat memulai ~/.bashrc
dengan
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
Zsh selalu membaca ~/.zshenv
ketika itu dimulai. Gunakan dengan hati-hati, karena ini dibaca oleh setiap instance zsh, bahkan jika itu adalah subkulit tempat Anda menyetel variabel lain. Jika zsh adalah shell login Anda dan Anda ingin menggunakannya untuk mengatur variabel hanya untuk perintah jarak jauh, gunakan penjaga:setel beberapa variabel di ~/.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, pengelola tampilan, dan lingkungan desktop diatur untuk menjalankan ~/.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 dengan ~/.xsession
, ini adalah tempat di mana Anda harus mengatur variabel lingkungan Anda; lakukan dengan sumber ~/.profile
(yaitu . ~/.profile
). Perhatikan bahwa dalam beberapa penyiapan, skrip startup lingkungan desktop akan menggunakan ~/.profile
lagi.