Di mana mendeklarasikan variabel lingkungan?

59

Apa tempat yang benar untuk:

  1. Variabel lingkungan global dimaksudkan untuk memengaruhi semua pengguna?
  2. Variabel lingkungan khusus pengguna?
Ivan
sumber

Jawaban:

16

Saya pikir halaman wiki komunitas tentang variabel lingkungan akan membantu Anda memilah

sagarchalise
sumber
2
Masalahnya adalah bahwa dokumen yang ditautkan bingung dan / atau salah dalam bagian variabel pengguna-spesifik. Saya masih berusaha menemukan cara agnostik shell untuk melakukannya. $ HOME /. Profil mungkin adalah taruhan terbaik ...
Rmano
16
Harap tempel teks atau ambil snapshot dari konten yang tertaut - mungkin tidak tersedia di masa depan!
Nam G VU
4
Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
Thomas Ward
75

Untuk menambah jawaban sagarchalise, saya dapat meringkas apa yang disarankan tautan sebagai tempat yang tepat untuk pengaturan.

Untuk pengaturan global, variabel lingkungan sistem-lebar

  • Menggunakan /etc/environment
  • Jangan gunakan /etc/profileatau/etc/bash.bashrc

Dari halaman:

/etc/environment[...] secara khusus dimaksudkan untuk pengaturan variabel lingkungan sistem-lebar. Ini bukan file skrip, melainkan terdiri dari ekspresi penugasan, satu per baris. Secara khusus, file ini menyimpan pengaturan lokal dan jalur sistem.

Menggunakan /etc/profileadalah cara yang sangat Unix-y untuk pergi, tetapi fungsinya sangat berkurang di bawah Ubuntu. Itu ada hanya untuk menunjuk /etc/bash.bashrcdan mengumpulkan entri dari /etc/profile.d.

Di sistem saya, satu-satunya entri yang menarik di profile.d adalah /etc/profile.d/bash_completion.sh.

Untuk pengaturan lokal atau per pengguna

Versi sebelumnya dari halaman Ubuntu direkomendasikan ~/.pam_environment, tetapi halaman saat ini menyarankan bahwa jika itu tidak berhasil, Anda harus menggunakan

  • ~/.profile - Ini mungkin file terbaik untuk menempatkan penugasan variabel lingkungan, karena akan dieksekusi secara otomatis oleh DisplayManager selama sesi desktop proses startup serta oleh shell login ketika seseorang masuk dari konsol tekstual.

  • ~/.bash_profileatau ~./bash_login- Jika salah satu dari ini ada, bash menjalankannya alih-alih ~/.profileketika bash dimulai sebagai shell login. Bash akan lebih memilih ~/.bash_profileuntuk ~/.bash_login. [...] File-file ini tidak akan mempengaruhi sesi grafis secara default. "

  • ~/.bashrc - "... mungkin tempat termudah untuk mengatur variabel".
belacqua
sumber
1
Program mana yang dibaca /etc/environmentdan kapan? Tampaknya tidak bekerja dengan cron, bahkan ketika menggunakanSHELL=/bin/bash
SystemParadox
1
Tampaknya / etc / environment adalah bagian dari PAM, yang berarti ia harus mengatur lingkungan default untuk semua proses. cron adalah spesial (yaitu rusak) khususnya menimpa lingkungan ini dengan miliknya.
SystemParadox
jadi bagaimana berperilaku .bashrc? setelah bash_profile? alih-alih .profile?
opensas
1
@opensas Anda mungkin harus mengajukan pertanyaan terpisah, merujuk yang ini atau jawabannya.
belacqua
@belacqua katakanlah saya perlu menambahkan 2 atau lebih variabel lingkungan untuk /etc/environmentdisukai JAVA_HOME="/opt/java" dan ANT_HOME="/opt/ant" bagaimana melakukannya
Kasun Siyambalapitiya
7

Kamu sudah memperoleh:

/ etc / profile: file profil. lebar sistem untuk shell Bourne (sh (1)) dan shell kompatibel Bourne (bash (1), ksh (1), ash (1), ...).

yang dijalankan oleh Lucid dan Maverick

/etc/profile.d/*.sh

jika ada, dan jika shell pengguna adalah bash:

/etc/bash.bashrc

Untuk lingkungan pengguna, ada array membingungkan khusus untuk shell dan apakah itu dianggap sebagai "shell login". Jika shell adalah bash:

   ~/.bash_profile
          The personal initialization file, executed for login shells
   ~/.bashrc
          The individual per-interactive-shell startup file

untuk sh / dash:

$HOME/.profile

untuk zsh, aku bahkan tidak akan mencoba memahami ini .

msw
sumber
5

Seperti yang disarankan di https://help.ubuntu.com/community/EnvironmentVariables :

  1. Variabel lingkungan global yang dimaksudkan untuk memengaruhi semua pengguna harus masuk /etc/environment.

  2. Variabel lingkungan khusus pengguna harus ditetapkan ~/.pam_environment.

Hindari file profil dan rc untuk mengatur variabel lingkungan di Ubuntu. Mereka telah menyebabkan saya sakit kepala lebih dari yang seharusnya.

Namun ini lebih mudah diucapkan daripada dilakukan;)

Mungkin saja Anda mengalami celah konfigurasi yang sama yang ada untuk saya. Lihat solusi untuk rumah terenkripsi di bawah ini.

Saya ~/.pam_environment:

PATH            DEFAULT=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:${HOME}/bin
IDEA_JDK        DEFAULT=${HOME}/Applications/jdk

Mengapa jalur statis jelek? ${PATH}tidak akan bekerja untuk saya. Saya merusak login saya beberapa kali mencoba untuk mengatasinya jadi saya tetap dengan salinan statis default jelek :)

Solusi untuk Folder Rumah Terenkripsi

Di Ubuntu, rilis hingga dan termasuk Precise 12.04 Beta 2, jika Anda menggunakan direktori home terenkripsi, Anda perlu memodifikasi /etc/pam.d/common-sessionuntuk membuatnya dimuat ~/.pam_environment. Solusi ini tampaknya berfungsi untuk rilis sebelumnya, tetapi saya belum mengujinya.

Guenther Montag (g-montag) menulis pada 2010-08-19:

Ini tampaknya menjadi masalah dengan direktori home terenkripsi. saya tambahkan

sesi diperlukan pam_env.so

di akhir /etc/pam.d/common-session dan sekarang ~ / .pam_environment dibaca. Pada sistem lain tanpa direktori home terenkripsi (juga 10,04) pekerjaan di sekitar tidak diperlukan. Mungkin dalam kasus saya sistem mencoba membaca ~ / .pam_environment sebelum didekripsi.

Diadaptasi dari jawaban saya di Super User: https://superuser.com/a/408373/66856

Alain O'Dea
sumber
Ini masih salah: ${HOME}tidak akan berhasil juga. Tidak ada ekspansi di .pam_environment.
detly
2
@Detly ada ekspansi .pam_environment, tetapi HOMEbiasanya tidak diatur awal. Jika baris itu telah membaca DEFAULT=${PATH}/Applications/jdk, Anda akan melihat nilai yang PATHdimasukkan di dalamnya.
muru