Mengatur variabel lingkungan Linux


9

Saya menjalankan Red Hat Linux Enterprise 5; Saya selalu menggunakan perintah ekspor untuk mengatur variabel lingkungan.

Apakah ada cara lain untuk mengatur variabel lingkungan dan apa keuntungan / kerugiannya?

Jawaban:


16

Ini adalah kutipan dari halaman manual Bash:

ekspor [-fn] [nama [= kata]] ...
ekspor -p
Nama yang diberikan ditandai untuk ekspor otomatis ke lingkungan perintah yang dieksekusi selanjutnya. Jika opsi -f diberikan, nama merujuk ke fungsi ...

Jika Anda hanya perlu variabel di lingkungan saat ini, tidak perlu menggunakan ekspor.

var=value

Edit:

Tanpa ekspor: hanya lingkungan saat ini. Dengan ekspor: lingkungan saat ini dan lingkungan anak.

Berikut ini demonstrasi pengaruh ekspor terhadap ketersediaan variabel dalam lingkungan anak dan bahwa perubahan dalam lingkungan anak tidak memengaruhi induk:

$ var1=123
$ export var2=456
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []
$ var3=789 bash -c 'echo "child [$var1] [$var2] [$var3]"; var1=111; var2=222; var3=333; echo "child [$var1] [$var2] [$var3]"'
child [] [456] [789]
child [111] [222] [333]
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []

Setelah gema pertama ( echo "parent...") Anda melihat "123" dan "456" karena keduanya var1dan var2aktif di lingkungan saat ini. Anda tidak melihat nilai var3karena belum ditetapkan.

Setelah baris yang dimulai " var3=..." Anda tidak melihat nilainya var1karena tidak diekspor. Anda melakukan melihat nilai untuk var2karena itu diekspor. Anda melihat nilai var3karena itu ditetapkan untuk lingkungan anak -satunya .

( bash -csetara dengan menjalankan skrip dengan isi argumen ke -copsi. Sebuah skrip atau yang dapat dieksekusi lainnya, atau dalam hal ini, argumen untuk bash -cmenjadi anak dari lingkungan saat ini yang, sebagai akibatnya, tentu saja, anak induk.)

Dalam "skrip" nilai-nilai variabel diubah. Sekarang output nilai-nilai baru itu.

Setelah "skrip" selesai, eksekusi kembali ke lingkungan induk (baris perintah dalam kasus ini). Setelah gema terakhir, Anda melihat nilai-nilai asli karena perubahan yang dibuat di lingkungan anak tidak mempengaruhi orangtua.


Apa artinya "di lingkungan saat ini"? Skrip bash saat ini atau?
George2

1
Ya, itu berarti "dalam skrip saat ini" atau "dalam sesi interaktif saat ini". Sehingga mengecualikan executable atau skrip yang dijalankan dari dalam skrip saat ini atau sesi interaktif. Itulah tujuan export- untuk membuat variabel tersedia untuk lingkungan anak ini.
Dijeda sampai pemberitahuan lebih lanjut.

Saya menemukan beberapa konflik dari apa yang Anda katakan. :-) Anda mengatakan "Jadi tidak termasuk executable atau skrip", perhatikan untuk "mengecualikan", tetapi dalam apa yang Anda kutip, Anda menyebutkan "Nama-nama yang diberikan ditandai untuk ekspor otomatis ke lingkungan perintah yang dieksekusi selanjutnya." - itu menjadi "termasuk" (otomatis diekspor ke, atau dampak), dan tidak "mengecualikan". Saya bingung, bisakah Anda mengklarifikasi?
George2

1
@ George2: Lihat jawaban saya yang diedit untuk informasi lebih lanjut.
Dijeda sampai pemberitahuan lebih lanjut.

3

Itu kata kamu

Saya selalu menggunakan perintah ekspor untuk mengatur variabel lingkungan

Dengan cara Anda mengatakan itu, sepertinya Anda benar-benar mencoba untuk bertanya bagaimana Anda membuat variabel lingkungan tetap ada. Untuk melakukan itu akan mengharuskan Anda untuk menempatkan export VAR="foo"pernyataan Anda dalam file $ HOME / .bash_profile Anda (jika Anda menggunakan bash). Jika Anda ingin agar variabel lingkungan tetap ada untuk semua pengguna selain root, tambahkan ke / etc / profile. Jika Anda ingin menambahkannya untuk pengguna root juga, maka atur di /root/.bash_profile.

Ini akan bekerja untuk semua shell login di mana bash adalah shell pilihan. Untuk shell yang tidak masuk, Anda harus menggunakan .bashrc. Saya tidak memiliki wawasan untuk menawarkan untuk kerang lain: D


2
Anda mungkin ingin membaca ulang bagian dari halaman Bash man tentang kapan file-file tersebut bersumber.
Dijeda sampai pemberitahuan lebih lanjut.

1
Yup ... Saya jadi bingung login dan interaktif. Mengedit jawaban saya untuk mencerminkan. Terima kasih atas koreksinya!
whaley

"buat variabel lingkungan tetap ada" - apa artinya bertahan?
George2

1
"Tetap" berarti Anda ingin variabel ini memiliki nilai ini setiap kali sebuah shell dimulai. Mungkin perlu atau tidak perlu untuk mengekspor variabel tergantung pada apa tujuannya.
Dijeda sampai pemberitahuan lebih lanjut.

1
Itu berarti Anda belum membuatnya gigih. Coba lakukan apa yang digambarkan paus .
Dijeda sampai pemberitahuan lebih lanjut.

1

ekspor adalah cara paling mudah untuk melakukannya, jadi mengapa tidak membiarkannya begitu saja?

export VARIABLE=value    # for Bourne, bash, and similar shells
setenv VARIABLE value    # for csh and similar shells

2
Bourne shell membutuhkan VARIABEL = nilai; export VARIABLE
mpez0

1
Ini seharusnya bekerja juga ...
BloodPhilia

@BloodPhilia, untuk bash, hanya satu cara untuk mengatur variabel lingkungan?
George2

1
@ George2 - Saat menggunakan VARIABEL = nilai, Anda membuat variabel lokal yang hilang setelah eksekusi skrip saat ini. Saat menggunakan ekspor, proses anak-anak mewarisi nilai variabel dari proses induknya. Sebagai contoh: FOO=BAR; executethisprogram Program executethisprogramTIDAK AKAN tahu nilai variabel FOO. Di sisi lain, ketika menggunakan: FOO=BAR; export FOO; executethisprogram Program executethisprogramAKAN tahu nilai variabel FOO.
BloodPhilia

1
executethisprogram ini bukan merupakan subproses dari "ekspor FOO". Ini adalah subprocess (child) dari skrip yang memanggilnya atau shell interaktif (command-line). export FOOadalah perintah yang menandai variabel FOOsehingga dapat diakses oleh proses anak dari lingkungan di mana perintah itu dikeluarkan. Orang tua itu bisa berupa skrip atau shell interaktif.
Dijeda sampai pemberitahuan lebih lanjut.

1

Anda juga dapat melakukan sesuatu seperti ini:

VAR=val application

Sebagai contoh:

LANG=C ls --help

output dalam bahasa Inggris.

LANG=pl_PL ls --help

output dalam bahasa Polandia (jika tersedia).

Di masa lalu di sh Anda tidak dapat melakukan ekspor VAL = val. Anda harus

VAL=val; export VAL

Saya bingung tentang "VAR = aplikasi val", apa artinya val dan apa artinya aplikasi?
George2

2
Contoh-contoh ini mengatur nilai variabel untuk lingkungan anak ( ls, misalnya) tanpa mempengaruhi nilai variabel itu di lingkungan (orang tua) saat ini.
Dijeda sampai pemberitahuan lebih lanjut.

Apakah lingkungan anak itu seperti apa? Saya bingung.
George2

1
lsadalah anak dari proses dari mana ia dijalankan. Jika saya mengetik lspada prompt perintah, shell interaktif adalah orang tua dan lsadalah anak. Jika saya memiliki skrip yang digunakan lsmaka skrip adalah orang tua dan lsanak.
Dijeda sampai pemberitahuan lebih lanjut.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.