Bagaimana cara menetapkan variabel lingkungan pengguna? (secara permanen, bukan sesi)

145

Ini menjengkelkan saya. Saya melihat beberapa saran (semua menggunakan file dan sintaks yang berbeda) dan tidak ada yang bekerja.

Bagaimana cara menetapkan variabel lingkungan untuk pengguna tertentu? Saya sedang memeras debian. Apa sintaks yang tepat yang harus saya masukkan ke file untuk membuat ABC = "123"?

Gilles
sumber
7
Apa yang sudah Anda coba?
l0b0
1
mengedit .bashrc, .bash_profile, .profile dan .ssh / eviroment. Meskipun saya tidak tahu apakah saya menulisnya di lokasi yang tepat atau memiliki sintaks yang tepat setiap kali
4
.bashrcadalah tempat utama untuk itu.
rozcietrzewiacz
@rozcietrzewiacz: ok tapi ... bahkan setelah memiliki solusi saya mencoba pengaturan ABC1 dan ABC2 pada awal dan akhir file itu dan tidak diatur di lingkungan saya.
1
Periksa yang .bash_profileberisi sesuatu seperti [[ -f ~/.bashrc ]] && . ~/.bashrc.
rozcietrzewiacz

Jawaban:

113

Anda harus meletakkan deklarasi di file inisialisasi shell Anda:

  • Jika Anda menggunakan bash, ash, ksh atau shell Bourne-style lainnya, Anda dapat menambahkan

    ABC="123"; export ABC
    

    dalam .profilefile Anda ( ${HOME}/.profile). Ini adalah situasi default pada sebagian besar instalasi Unix, dan khususnya pada Debian.

    Jika shell login Anda adalah bash, Anda dapat menggunakan .bash_profile( ${HOME}/.bash_profile) atau .bash_loginsebagai gantinya.

    Catatan: Jika salah satu dari file-file ini ada dan shell login Anda adalah bash, .profiletidak dibaca ketika Anda login lebih dari ssh atau pada konsol teks, tetapi mungkin masih dibaca bukan .bash_profilejika Anda masuk dari GUI. Juga, jika tidak ada .bash_profile, maka gunakan .bashrc.

  • Jika Anda telah menetapkan zsh sebagai shell login Anda, gunakan ~/.zprofilesebagai ganti ~/.profile.

  • Jika Anda menggunakan tcsh, tambahkan

    setenv ABC "123"
    

    dalam .loginfile ( ${HOME}/.login)

  • jika Anda menggunakan shell lain lihat manual shell cara mendefinisikan variabel lingkungan dan file mana yang dieksekusi pada startup shell.

Matteo
sumber
5
Perilaku default su useradalah untuk mengubah kepemilikan shell saat ini ke arg nama pengguna, sambil menjaga direktori home dan lingkungan pengguna panggilan. Untuk memasukkan shell sedemikian rupa untuk menjadi pengguna baru, dan mendapatkan semua pengaturan lingkungan mereka ($ PATH, $ HOME, $ ABC, dll) Anda harus memberikan a - sebagai argumen pertama untuk su. su - usernameakan mencapai apa yang Anda minta.
Tim Kennedy
1
Tunggu: apa yang Anda maksud dengan "keluar ke root"? Bagaimanapun membuat su ' tidak menginisialisasi shell. Anda perlu 'su -' (lihat man su)
Matteo
1
Mengapa Anda sudi tempat pertama? Bukankah Anda baru saja membuat milik root .profileyang tidak dapat digunakan oleh pengguna?
rozcietrzewiacz
1
@id ini adalah apa yang seharusnya dilakukan. Pertanyaannya adalah, apa yang bersumber ketika Anda login. Untuk memeriksa bahwa, log out pertama.
rozcietrzewiacz
7
Karena .profiledibaca oleh semua shell yang kompatibel dengan Bourne, Anda tidak boleh menulis sintaks Bash dalam file itu. Secara khusus, export VARIABLE=valueperlu direactored menjadi VARIABLE=value; export VARIABLE.
tripleee
48

Gunakan /etc/environmentfile untuk mengatur variabel lingkungan. Kemudian tambahkan baris berikut di dalam /etc/environmentfile.

ABC="123"

Sekarang variabel ABC akan dapat diakses dari semua sesi pengguna. Untuk menguji output variabel, segarkan dulu variabel lingkungan menggunakan perintah

source /etc/environment

dan lari echo $ABC.

Hokam
sumber
4
+1 untuk perintah sumber. Itu hilang dalam semua jawaban
Nerrve
5
Hati-hati yang /etc/environmenttidak mendukung sintaks bash penuh, sesuatu yang saya temukan dengan cara yang sulit. Misalnya, menempatkan PATH="/usr/bin:/usr/sbin"dan kemudian melakukan PATH="$PATH:/foo/bar"pada baris berikut tidak akan berhasil
user2428118
Tidak yakin apakah ini masalah pribadi atau apa, tapi saya harus mem-boot ulang OS saya setelah pengaturan ini /etc/environment, bahkan jika saya me- restart terminal bash atau mengetik source /etc/environment. Jadi, jika Anda mengalami masalah ketika variabel lingkungan tidak bertahan, coba reboot.
Blairg23
9

Ini adalah prosedur umum yang dapat Anda gunakan untuk hampir semua shell. Dalam hal apa pun, Anda harus tahu shell mana yang biasanya akan digunakan pengguna untuk login:

path="$(grep $USER /etc/passwd | cut -d ':' -f 7)"
shell="$(basename -- "$path")"

Maka Anda harus mencari file dot mana yang biasanya dibaca oleh shell ini:

man $shell

Cara pintas yang mungkin berfungsi adalah mendaftar file-file dot yang berisi nama shell:

ls ~/.*${shell}*

Jika Anda ingin memeriksa apakah salah satu file benar-benar dibaca saat login, Anda cukup mencetak nama file di masing-masing, misalnya:

echo .bashrc

Saat masuk, Anda harus melihat file mana yang sedang dibaca, dan Anda dapat memutuskan mana yang akan dimodifikasi. Berhati-hatilah agar Anda tidak mencoba menggunakan echo "$0"atau serupa, karena nilai $0tergantung pada bagaimana shell memproses file-dot, dan bisa menyesatkan.

Ketika datang untuk mendeklarasikan variabel "secara permanen", perhatikan bahwa ini hanya meluas ke sesi. Tidak ada cara untuk mengakses nilai variabel tanpa sesi, jadi tidak ada artinya di luar satu. Jika Anda maksud "read-only", itu tergantung pada shell, dan di Bash Anda dapat menggunakan:

declare -r VAR

apakah sudah memiliki nilai, atau

declare -r VAR=value

untuk menetapkannya secara bersamaan. Tidak semua shell memiliki fitur ini.

Untuk mendeklarasikan variabel di sebagian besar shell, Anda harus menggunakan nama variabel ( [A-Za-z_][A-Za-z0-9_]*), diikuti oleh tanda sama dengan (dan tidak ada spasi di sekitar tanda sama), lalu nilai (lebih disukai dikutip kecuali nilainya sederhana [A-Za-z0-9_]+). Sebagai contoh:

name="John Doe"
ip=127.0.0.1
HORRIBLE=1
l0b0
sumber
5

Gunakan ekspor.

export ABC="123"

Untuk memeriksa apakah sudah diatur, gunakan

env

dan / atau

env | grep ABC

Untuk menambahkannya secara permanen, tambahkan ini ke ~/.bashrcfile Anda .

export ABC="123"
siapa saya
sumber
6
Dia ingin tahu hot untuk mendefinisikannya secara permanen , yaitu, di mana file untuk meletakkan definisi.
Matteo
1
Tidak bekerja Setelah saya keluar variabelnya hilang. Saya membutuhkannya di seluruh sesi
1
maksudmu permenatedan bukan permenently: D
whoami
lihat edit untukbashrc
whoami
5
apa permenate? maksudmu permanent?
SSH
3

Perintah yang tepat adalah:

echo 'export ABC = "123"' >> ~/.profile
Иван Бишевац
sumber
4
Persis? Serius? Shell apa (a) berbunyi ~/.profiledan (b) memungkinkan ruang sebelum dan sesudah =?
G-Man
1

Cara terbaik yang bekerja untuk saya adalah memodifikasi file .bashrc di BASH shell.

gunakan ini misalnya:

  1. buka file .bashrc Anda
  2. tambahkan baris ini:

    export <VARIABLE> = "<ANY PATH/VALUE you want>"
    

    misalnya: export HOME = "/home/user/"

    Ingatlah untuk menggunakan ""karena menggunakan ' 'tidak akan berfungsi dan file bashrc Anda akan melaporkan kesalahan saat sumber.

  3. sumber itu di sesi saat ini.

Saya juga mencoba untuk memodifikasi file / etc / environment tetapi tidak memungkinkan saya untuk membuat variabel lingkungan baru dan ketika saya membuatnya, itu meminta kesalahan bahwa variabel yang ditentukan tidak ditemukan.

Ayushi Agarwal
sumber