Mengatur variabel lingkungan global untuk semua orang

17

Jika saya mengatur variabel dalam /etc/environment, hanya tampaknya berlaku untuk administrator sementara di sudo su.

Bagaimana saya bisa mendapatkan variabel untuk diterapkan ke semua orang? Apalagi ketika mereka berada di terminal? Apakah pengaturan dalam /etc/enviromenttidak berlaku untuk bash?

Mick
sumber

Jawaban:

13

The /etc/environmentpembaruan hanya akan bekerja pada sesi berikutnya, itu tidak otomatis reloaded.

Yang berarti Anda tidak dapat mengubahnya untuk sesi yang sudah dimulai untuk pengguna lain.

Jika Anda ingin "memuat ulang" apa pun yang ada di dalam, /etc/environmentAnda memerlukan perintah berikut:

source /etc/environment

Tetapi sekali lagi itu hanya akan bekerja untuk sesi Anda sendiri saat ini, pengguna lain tidak akan terpengaruh sampai mereka memulai sesi baru atau menjalankan perintah di atas dalam sesi mereka sendiri.

Panthro
sumber
4

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 suseperti yang Anda amati ... atau dengan keluar / masuk atau me-reboot. Anda bisa suke 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/*.shdan /etc/environmentuntuk 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/profilemengambil 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/profiledan /etc/profile.d/*.shhanya 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 bashrctidak 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/profileatau /etc/profile.d/my-custom-env.shatau ~/.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

mattpr
sumber
3

buat skrip shell khusus di bawah

/etc/profile.d/

tambahkan variabel lingkungan global Anda di dalam skrip yang Anda buat, reboot mesin maka itu akan tersedia untuk semua orang.

shalamus
sumber
Saya percaya ini adalah pendekatan yang lebih dapat diandalkan daripada mengedit file / etc / environment karena file tersebut dapat diubah karena paket diperbarui.
phreed
2

Menambahkan variabel agar /etc/environmentberhasil bagi saya.

Namun saya memang harus reboot setelah mengubah /etc/environmentagar perubahan berlaku. Cukup menutup dan membuka kembali jendela terminal tidak cukup.

keris
sumber
3
Anda selalu dapat melakukan source /etc/environmentuntuk memuatnya kembali.
Panthro
Logout dan kembali harus cukup.
Karuhanga