TL; DR
File konfigurasi ini apakah global ( /etc/environment
, /etc/profile
) atau khusus pengguna ( ~/.profile
, ~/.bashrc
) hanya diproses pada login / sesi berikutnya.
File global berlaku untuk semua pengguna (bukan hanya root) ... tetapi Anda harus memulai kembali sesi login Anda untuk melihat perubahan yang tercermin di lingkungan. Ini bisa terjadi dengan memanggil su
seperti yang Anda amati ... atau dengan keluar / masuk atau me-reboot. Anda bisa su
ke pengguna non-root dan Anda akan melihat mereka juga memiliki perubahan lingkungan.
Alasan mengapa Anda perlu melakukan reboot atau login lagi untuk mendapatkan lingkungan global diambil adalah karena lingkungan diwarisi dari proses induk dan proses root untuk semua yang Anda jalankan adalah shell login Anda ... jadi jika shell login Anda tidak memiliki lingkungan ... maka proses juga tidak dimulai dalam shell login. Anda tentu saja dapat mengatur / memperbarui lingkungan untuk setiap proses saat Anda memulai, tetapi Anda harus mengatur lingkungan untuk shell login dan memulai kembali semua sub proses agar mereka melihat perubahannya.
Lingkungan global
Seperti yang disebutkan orang lain, Anda memerlukan reboot atau logout / login untuk perubahan /etc/profile
, /etc/profile.d/*.sh
dan /etc/environment
untuk diambil.
Ini karena sementara file-file ini menentukan lingkungan global ... mereka hanya dijalankan sekali saat login dan karenanya login / sesi yang ada tidak akan mencerminkan perubahan pada file-file itu. Restart "me-reset" login semua orang memaksa mereka untuk mengambil lingkungan baru.
Di sesi login Anda sendiri, Anda dapat source /etc/profile
mengambil perubahan tanpa reboot atau logout / login ... tetapi itu hanya akan memengaruhi sesi Anda sendiri dan proses baru yang berjalan dalam sesi Anda.
Perhatikan juga bahwa tidak ada interpolasi variabel di /etc/environment
(itu bukan skrip) sehingga Anda tidak dapat melakukan hal-hal seperti di PATH="$PATH:/my/custom/path"
sana.
Perhatikan juga bahwa /etc/profile
dan /etc/profile.d/*.sh
hanya dijalankan untuk sesi login dan dengan demikian lingkungan terkonfigurasi tidak akan tersedia untuk sistem akun non-login (yaitu jika Anda mencoba mengatur variabel lingkungan untuk proses daemon yang berjalan di luar shell login Anda).
Catatan yang bashrc
tidak berguna untuk pengaturan lingkungan untuk seluruh shell login tetapi untuk shell bash dan sub proses ... jadi untuk true "global" atau "user global" Anda mungkin ingin meletakkan konfigurasi lingkungan Anda di /etc/profile
atau /etc/profile.d/my-custom-env.sh
atau ~/.profile
. Shell lain (misalnya zsh) memiliki file konfigurasi sendiri juga sehingga konfigurasi lingkungan non-bash khusus dalam bashrc akan menyebabkan masalah atau kebingungan jika / ketika Anda mengganti shell (atau meminta pengguna lain pada sistem menggunakan shell yang berbeda).
Ini adalah masalah umum untuk menginstal program baru dan perlu menentukan beberapa lingkungan agar dapat berjalan dengan baik. Lingkungan global adalah satu jawaban, tetapi seringkali akan membutuhkan reboot yang tidak ideal untuk server dan penyediaan / konfigurasi kasus penggunaan. Anda harus bertanya pada diri sendiri apakah ini benar-benar variabel yang dibutuhkan oleh semua pengguna dan program pada sistem atau apakah itu benar-benar hanya sesuatu yang Anda perlukan agar tersedia bagi pengguna atau program tertentu.
Untuk pengguna tertentu
lihat menyertakan lingkungan di profil atau bashrc di direktori home pengguna (mis. ~/.profile
~/.bashrc
) tergantung pada apakah Anda menginginkan ini untuk interaktif, shell login, hanya bash, dll.
Perlu diingat bahwa ini juga membutuhkan reboot atau logout / login agar perubahan lingkungan tersedia untuk semua proses dalam sesi login pengguna. Pengguna dapat source ~/.profile
... tetapi itu dilakukan dalam terminal dan hanya memperbarui lingkungan dalam sesi terminal dan proses anak ... tidak harus untuk seluruh lingkungan login pengguna.
Untuk program tertentu ada beberapa opsi.
Salah satunya adalah dengan menyediakan lingkungan saat menjalankan perintah:
VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE" /path/to/program --opt1 --op2
Jika Anda menggunakan systemd Anda juga dapat menentukan lingkungan dalam file Unit / layanan di bawah [Service]
denganEnvironment=VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE
Opsi ini mungkin terasa kikuk karena Anda harus menentukan lingkungan setiap kali Anda menjalankan program, tetapi jika lingkungan benar-benar hanya diperlukan oleh program itu ... ini benar-benar cara terbaik dan Anda harus terbiasa dengannya dan tidak membuang semuanya ke dalam file bashrc atau profil.
Jika Anda tidak menggunakan systemd atau init untuk men-setup lingkungan dan menjalankan program ... maka tentu saja Anda juga bisa hanya membungkus eksekusi program dengan skrip bash di mana Anda menyimpan perintah lengkap termasuk pengaturan lingkungan untuk kenyamanan.
Referensi:
Ada juga jawaban yang sangat terperinci di sini yang saya sarankan Anda baca: /ubuntu//a/247769/824160