Variabel lingkungan vs variabel Shell, apa bedanya?

56

Seseorang mengatakan kepada saya bahwa:

BASH bukan variabel lingkungan, ini adalah variabel shell

Apa bedanya?

Tom Brito
sumber
Kedengarannya hal yang sama hanya memiliki ruang lingkup yang berbeda?
Alexander Mills

Jawaban:

35

$BASHadalah variabel lokal yang hanya valid dalam shell (bash) saat ini.

Variabel lingkungan seperti $SHELLyang berlaku di seluruh sistem. Di shell Bash saat ini, $BASHmenunjuk ke jalur eksekusi bash , sedangkan $SHELLmenunjuk ke shell didefinisikan sebagai default (yang mungkin memiliki nilai yang sama).

Untuk penjelasan tentang variabel lingkungan, lihat Variabel Lingkungan di Bantuan Ubuntu.

Takkat
sumber
1
Tautan yang bagus (+1) :)
Peter.O
12
Jawaban ini salah / tidak akurat. Variabel lingkungan TIDAK global / seluruh sistem. Variabel Shell bersifat pribadi untuk shell yang sedang berjalan , dan mereka TIDAK diekspor (diteruskan) ke proses anak apa pun. Variabel lingkungan diekspor ke setiap proses anak. "MYVAR = pribadi; ekspor OURVAR = dibagi; printenv" hanya akan melaporkan "OURVAR" karena ketika shell mengeksekusi perintah printenv, ia mengekspor OURVAR, tetapi bukan MYVAR.
CM
2
+1 untuk Komentar CM! Saya belum pernah mendengar perbedaan yang dijelaskan dengan begitu sederhana dan akurat !!! Komentar ini harus menjadi jawabannya.
Jesse the Wind Wanderer
48

Variabel lingkungan tersedia secara global, dalam sebuah program dan itu adalah program anak. Variabel shell hanya tersedia di shell saat ini. Untuk membuat variabel shell tersedia sebagai variabel lingkungan, gunakan export VARNAME(tanpa dolar $).

Contoh untuk klarifikasi:

$ SOME=VAR # define shell variable $SOME
$ echo $SOME
VAR
$ env | grep SOME # note: no output
$ export SOME # turn $SOME into an environment variable
$ env | grep SOME
SOME=VAR

Cara lain untuk mendefinisikan variabel lingkungan:

$ export ANOTHER=VALUE
$ echo $ANOTHER
VALUE
$ env | grep ANOTHER
ANOTHER=VALUE
Lekensteyn
sumber
Saya pikir ini tidak benar. exporttidak perlu menetapkan variabel lingkungan. stackoverflow.com/questions/7411455/…
Chris Stryczynski
3
@ChrisStryczynski exporttidak menetapkan variabel lingkungan untuk proses anak. Posting yang Anda tautkan tidak bertentangan dengan jawaban ini, dapatkah Anda menjelaskan mengapa Anda berpikir itu salah?
Lekensteyn
exportbenar-benar menetapkan variabel lingkungan
David Tonhofer
9

Ada perbedaan. Variabel Shell dan Variabel Lingkungan akan menjelaskan dengan lebih baik yang saya bisa, tetapi berikut adalah kutipan darinya:

Jika perubahan dilakukan ke variabel shell, itu harus secara eksplisit "diekspor" ke variabel lingkungan yang sesuai agar setiap subproses bercabang untuk melihat perubahan. Ingat bahwa variabel shell adalah lokal ke shell di mana mereka didefinisikan.

Peter.O
sumber
Saya mengomentari jawaban saya sendiri .. Saya sangat suka tautan Bantuan Ubuntu dalam jawaban Takkat ... (lebih baik daripada milik saya)
Peter.O
3
Plus tautan Anda tidak lagi berfungsi!
1

Variabel Shell: Jangka Pendek, Diterapkan hanya untuk instance shell saat ini, Tidak berlaku untuk seluruh sistem

Variabel Lingkungan: Penggunaan Jangka Panjang, Sistem Valid Lebar, Diizinkan Secara Global

Dengan konvensi Shell Variable memiliki nama mereka sebagai huruf kecil sementara Envn. Variabel ditulis sebagai huruf besar

Ashish
sumber
-1

Untuk menjawab pertanyaan ini pertama-tama cobalah untuk memahami ruang lingkup variabel.

Ketika Anda membuat variabel baru seperti SOME_ENV_VARIABLE="testing.txt"itu berada di SHELL scope, itu berarti itu dapat diakses oleh contoh shell di mana pengguna login. Ketika instance berubah misalnya Anda membuka terminal baru atau Anda mengganti shell (misalnya Anda beralih ke csh) Anda tidak dapat mengakses variabel itu.

Ketika Anda mengekspor variabel seperti export SOME_ENV_VARIABLEvariabel itu sekarang tersedia dalam lingkup lingkungan, itu berarti dalam hal itu jika Anda mengganti shell Anda masih dapat mengakses variabel itu. Mari kita coba mengerti dengan contoh berikut:

[vishrant@localhost]$ SOME_ENV_VARIABLE="testing.txt" #creating variable in bash shell
[vishrant@localhost]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost]$ export SOME_ENV_VARIABLE #variable now available with environment
[vishrant@localhost]$ env | grep SOME_ENV_VARIABLE
SOME_ENV_VARIABLE=testing.txt
[vishrant@localhost]$ csh #changing shell
[vishrant@localhost ~/shell_scripting]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost ~/shell_scripting]$ exit
exit #returned to parent shell
[vishrant@localhost]$ SOME_SHELL_VARIABLE="hello.txt"
[vishrant@localhost]$ csh
[vishrant@localhost ~/shell_scripting]$ echo $SOME_SHELL_VARIABLE
SOME_SHELL_VARIABLE: Undefined variable.

Analogi: mari kita asumsikan Anda memiliki apartemen dua kamar tidur dan Anda membaginya dengan teman sekamar lain. Area umum dapat diakses oleh siapa saja tetapi tidak di kamar tidur Anda, variabel lingkungan seperti area umum dan variabel shell seperti kamar tidur, jika Anda ingin sesuatu di area umum dapat diakses oleh siapa saja tetapi jika Anda menyimpannya di kamar tidur Anda hanya dapat dapat diakses oleh Anda.

Ingat jika membuka terminal baru Anda tidak akan dapat mengakses salah satu variabel karena Anda mengubah contoh itu . Untuk itu Anda harus menambahkan variabel Anda di salah satu .profileatau .bashrc(jika Anda menggunakan bash).

Vishrant
sumber