GNU/Linux >> Belajar Linux >  >> Linux

Perbedaan Penggunaan Antara Variabel Shell Dan Variabel Lingkungan?

Saya sebenarnya tidak tahu ada dua jenis variabel yang dapat saya akses dari baris perintah. Yang saya tahu adalah, bahwa saya dapat mendeklarasikan variabel seperti:

foo="my dear friends"
bar[0]="one"
bar[1]="two"
bar[2]="three"

atau mengaksesnya dengan tanda $, seperti:

echo $foo
echo ${bar[1]}

atau menggunakan variabel bawaan, seperti:

echo $PWD
PATH=$PATH:"/usr/bin/myProg"

Sekarang, saya mendengar ada dua (setidaknya?) jenis variabel:variabel shell dan variabel lingkungan.

  • Apa gunanya memiliki dua jenis yang berbeda?
  • Bagaimana cara mengetahui tipe variabel yang mana?
  • Apa kegunaan khas untuk masing-masingnya?

Jawaban yang Diterima:

Variabel lingkungan adalah daftar name=value pasang yang ada apapun programnya (shell, application, daemon…). Mereka biasanya diwarisi oleh proses anak-anak (dibuat oleh fork /exec sequence):proses anak-anak mendapatkan salinan variabel induknya sendiri.

Variabel shell memang ada hanya dalam konteks shell. Mereka hanya diwariskan dalam subkulit (yaitu ketika shell bercabang tanpa exec operasi). Bergantung pada fitur shell, variabel mungkin tidak hanya berupa string sederhana seperti variabel lingkungan tetapi juga array, gabungan, variabel yang diketik seperti integer atau floating point, dll.

Saat shell dimulai, semua variabel lingkungan yang diwarisi dari induknya juga menjadi variabel shell (kecuali variabel tersebut tidak valid sebagai variabel shell dan kasus sudut lainnya seperti IFS yang diatur ulang oleh beberapa shell) tetapi variabel yang diwarisi ini ditandai sebagai diekspor. Itu berarti mereka akan tetap tersedia untuk proses anak-anak dengan nilai yang berpotensi diperbarui yang ditetapkan oleh shell. Itu juga kasus dengan variabel yang dibuat di bawah shell dan ditandai sebagai diekspor dengan export kata kunci.

Array dan variabel tipe kompleks lainnya tidak dapat diekspor kecuali nama dan nilainya dapat dikonversi ke name=value pola, atau ketika mekanisme khusus shell ada (mis.:bash mengekspor fungsi di lingkungan dan beberapa shell eksotis non POSIX seperti rc dan es dapat mengekspor array).

Jadi perbedaan utama antara variabel lingkungan dan variabel shell adalah cakupannya:variabel lingkungan bersifat global sedangkan variabel shell yang tidak diekspor bersifat lokal ke skrip.

Perhatikan juga bahwa shell modern (setidaknya ksh dan bash ) mendukung cakupan variabel shell ketiga. Variabel yang dibuat dalam fungsi dengan typeset kata kunci bersifat lokal untuk fungsi itu (Cara fungsi dideklarasikan mengaktifkan/menonaktifkan fitur ini di bawah ksh , dan perilaku persistensi berbeda antara bash dan ksh ). Lihat https://unix.stackexchange.com/a/28349/2594

Terkait:Perbedaan antara "penyimpanan reg" dan "ekspor reg"?

Ini berlaku untuk shell modern seperti ksh , dash , bash dan serupa. Shell Bourne lawas dan shell sintaksis non Bourne seperti csh memiliki perilaku yang berbeda.


Linux
  1. Apa perbedaan antara env dan set (di Mac OS X atau Linux)?

  2. Apa perbedaan antara nohup dan ampersand

  3. Apa perbedaan antara unlink dan rm?

  1. Apa perbedaan antara InnoDB dan MyISAM?

  2. Perbedaan Antara Shell Login dan Shell Non-login?

  3. Apa Perbedaan Antara Sudo Su – Dan Sudo Su —?

  1. Perbedaan Getty dan Agetty?

  2. Perbedaan Antara .exrc Dan .vimrc?

  3. Linux – Apa Perbedaan Antara `su -` Dan `su –login`?