Perbedaan antara variabel lingkungan dan variabel shell

8

Dikatakan bahwa variabel lingkungan diwariskan dalam proses anak tetapi variabel shell tidak. Namun tes berikut menunjukkan variabel shell terlihat dalam proses anak seperti halnya variabel lingkungan. Apa bedanya?

> bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
> export TEST="ENV_TEST"    #env var
> sh -c "echo \$TEST"
ENV_TEST
> TEST="SHELL_TEST"         #shell var
> sh -c "echo \$TEST"       #shell var is seen in child process
SHELL_TEST
ning
sumber

Jawaban:

9

Tugas kedua Anda TEST="SHELL_TEST"tidak membatalkan ekspor variabel. Itu masih ditandai sebagai "untuk diwarisi oleh anak-anak". Dan nilai yang diwarisi oleh anak adalah nilai yang saat ini ditetapkan di induk.
Dengan kata lain, tugas kedua Anda tidak mengembalikan status TESTke variabel shell, itu masih variabel lingkungan menurut terminologi itu.

Anda harus membatalkan ekspornya agar tidak disetel dalam proses anak-anak:

$ typeset +x TEST
$ sh -c 'echo $TEST'

$
Tikar
sumber
Hai Mat, terima kasih atas jawaban Anda. Jadi pemahaman saya (ada dua variabel bernama TEST, satu untuk variabel lingkungan dan satu untuk variabel shell, shell var TEST bayangan env var TEST.) Tidak benar, hanya ada satu variabel di Bash, selalu ada variabel shell dan dapat diatur untuk diekspor dan bertindak sebagai variabel lingkungan. Apakah ini khusus untuk Bash dan tergantung pada implementasi, atau bersifat universal di semua shell. Terima kasih.
ning
Tidak yakin tentang "universal", tetapi berfungsi sama dengan bash, ksh dan zsh setidaknya.
Mat
2
@ning Beginilah cara kerja semua kerang bergaya POSIX / Bourne modern (abu, ksh, bash, zsh). Ada versi kuno dari shell Bourne di mana mengubah variabel shell yang diekspor tidak mengubah nilai di lingkungan, tetapi Anda tidak akan menemukannya lagi. Csh bekerja secara berbeda, Anda mungkin masih menemukan itu di lingkungan kuno tapi itu juga sudah usang untuk sementara waktu.
Gilles 'SO- berhenti menjadi jahat'
@Gilles Terima kasih telah menjelaskan apa yang terjadi dan mengapa. Seperti yang dikatakan seseorang, setiap pengembang Unix juga harus menjadi sejarawan.
ning