Variabel Shell vs variabel Lingkungan, mana yang lebih disukai jika keduanya memiliki nama yang sama?

10

Mengetik berikut di Bash:

env | grep USER

dan

set | grep USER

memberikan kedua kali nama pengguna yang sama.

Bagaimana saya tahu, misalnya ketika mengetik echo $USERapakah shell atau variabel lingkungan telah ditampilkan?

sharkant
sumber

Jawaban:

14

Untuk kerang yang kompatibel dengan POSIX (termasuk Bash), standar tersebut mengatakan:

2.5.3 Variabel Shell Variabel
harus diinisialisasi dari lingkungan [...] Jika suatu variabel diinisialisasi dari lingkungan, ia harus ditandai untuk segera diekspor; lihat khusus ekspor built-in. Variabel baru dapat didefinisikan dan diinisialisasi dengan penugasan variabel, [dll]

Dan tentang export:

export name[=word]...
Shell harus memberikan atribut ekspor ke variabel yang sesuai dengan nama yang ditentukan, yang akan menyebabkan mereka berada di lingkungan perintah yang dieksekusi selanjutnya.

Jadi dari sudut pandang shell, hanya ada variabel. Beberapa dari mereka mungkin berasal dari lingkungan ketika shell dimulai, dan beberapa dari mereka mungkin diekspor ke lingkungan proses shell dimulai.

("Lingkungan" sebenarnya hanyalah sekelompok string yang diteruskan ke proses ketika dimulai. Ketika proses berjalan, ia dapat melakukan apa pun yang disukainya, gunakan, abaikan, timpa. Dan proses apa yang diteruskan. ketika memulai proses lain bisa menjadi hal lain, meskipun tentu saja itu biasa untuk meneruskan semua variabel lingkungan lagi.)


Jika Anda menggunakan beberapa shell non-POSIX, seperti csh, masalahnya mungkin berbeda:

$ csh
% echo $foo
foo: Undefined variable.
% setenv foo bar
% echo $foo
bar
% set foo=asdf
% echo $foo
asdf
% env |grep foo
foo=bar
% exit
ilkkachu
sumber
1
Perhatikan bahwa shell Bourne, seperti csh menginisialisasi variabel shell dari variabel lingkungan. Tetapi memodifikasi variabel shell tidak mempengaruhi variabel lingkungan yang sesuai kecuali Anda mengekspornya. Itu adalah sesuatu yang rusak oleh shell Korn (dan ditentukan oleh POSIX). Itu sebabnya Anda harus berhati-hati dengan nama variabel shell yang Anda gunakan sekarang untuk memastikan bahwa Anda tidak mengubah vars yang dapat mempengaruhi perintah yang Anda jalankan di skrip Anda.
Stéphane Chazelas
4

Ini adalah variabel satu dan sama. Dalam shell, berbeda dengan sebagian besar bahasa pemrograman lain, variabel lingkungan dan variabel shell berbagi ruang nama yang sama. Dalam shell, variabel lingkungan adalah variabel shell yang telah diekspor bersama export.

Lihat, misalnya, jawaban saya untuk pertanyaan Anda sebelumnya " Apa perbedaan penggunaan antara variabel shell dan variabel lingkungan? "

Kusalananda
sumber
saya akan membaca ulang penjelasan Anda, hanya saya perlu mempelajari beberapa hal terlebih dahulu, sebelum saya dapat memahami jawaban Anda.
sharkant
@sharkant Jangan khawatir sama sekali. Jika saya membingungkan, maka katakan saja dan saya akan coba klarifikasi. Jawaban ilkkachu juga bagus.
Kusalananda
tidak, saya tidak berpikir begitu, Anda memiliki gaya penjelasan yang baik, hanya saja kurangnya pengetahuan saya yang belum bisa menghargai mereka.
sharkant
2

Variabel Shell hanya dapat digunakan untuk shell saat ini, tidak dapat digunakan di seluruh sistem. Di sisi lain Variabel Lingkungan dapat digunakan System Wide. Sesuai Konvensi Shell Variabel ditulis sebagai huruf kecil sedangkan Variabel Lingkungan ditulis sebagai huruf besar. Anda dapat membuat variabel shell berfungsi sebagai variabel lingkungan, Anda hanya perlu mengekspornya.

Nazmul Ahmed Noyon
sumber