Variabel shell vs variabel lingkungan
MY_HOME="/home/my_user"
menetapkan variabel shell yang disebut MY_HOME
. Shell adalah bahasa pemrograman, dan memiliki variabel (juga disebut parameter). Setelah penugasan ini, Anda dapat menggunakan nilai variabel, misalnya dengan echo "$MY_HOME"
.
Variabel shell adalah konsep shell internal. Ketika instance shell itu berakhir, MY_HOME
dilupakan. Apa yang diketahui oleh setiap program dan ditransmisikan kepada anak-anaknya adalah variabel lingkungan .
Di dalam shell, variabel lingkungan dan variabel shell bekerja dengan cara yang sangat mirip. Apa yang sebenarnya terjadi adalah bahwa semua variabel lingkungan yang diwarisi oleh shell dari induknya menjadi variabel shell. Sebaliknya, variabel shell yang didefinisikan dalam skrip shell akan menjadi variabel lingkungan jika Anda mengekspornya .
export MY_HOME="/home/my_user"
Lebih detail Anda bisa melewatkan membaca pertama
Alasan mengapa variabel shell tidak secara otomatis menjadi variabel lingkungan adalah sebagian karena skrip mungkin secara tidak sengaja menggunakan nama variabel yang bermakna bagi program yang diluncurkannya, dan sebagian hanya historis.
Beberapa shell yang sangat lama export
harus digunakan setiap kali Anda mengubah nama variabel, tetapi semua shell modern melacak penugasan untuk variabel lingkungan, sehingga cuplikan berikut bergema bar
:
myvar=foo
export myvar
myvar=bar
env | grep '^myvar='
Juga, beberapa shell yang sangat tua membutuhkan perintah terpisah untuk myvar=foo
dan export myvar
, tetapi semua shell modern mengerti export myvar=foo
.
Anda dapat menjalankan set -a
untuk membuat semua tugas variabel shell secara otomatis mengekspor variabel, sehingga itu myvar=foo
setara dengan export myvar=foo
jika Anda berlari set -a
di shell itu terlebih dahulu.
Saat mengutip
Mengutip sebagian besar ortogonal. Jika nilai yang Anda tetapkan untuk variabel tidak berisi karakter apa pun yang khusus untuk shell, Anda tidak perlu tanda kutip. Jika ada karakter khusus, Anda perlu melindunginya dengan tanda kutip tunggal atau tanda kutip ganda atau garis miring terbalik atau kombinasi keduanya. Ini berlaku untuk myvar=value
sintaks biasa dan export
utilitas.
Ada satu perbedaan antara sintaks penugasan dan export
sintaksis. Shell memperluas hasil substitusi variabel $foo
lebih lanjut, melakukan pemisahan bidang (kata) dan ekspansi pathname (globbing) . Ini berarti bahwa jika nilainya myvar
adalah hello *
, maka echo $myvar
cetakan hello
diikuti oleh satu spasi diikuti oleh daftar file di direktori saat ini. Ini hampir tidak pernah diinginkan, maka prinsip umum untuk selalu menggunakan tanda kutip ganda sekitar substitusi variabel (kecuali jika Anda tahu bahwa Anda perlu pathname ekspansi atau membelah lapangan): echo "$myvar"
. Dalam kasus penugasan sederhana, othervar=$myvar
sebenarnya dapat diandalkan nilai myvar
untukothervar
, karena globbing dan pemisahan kata dihambat dalam penugasan (karena mereka membuat banyak kata, tetapi satu kata diharapkan). Dispensasi ini tidak berlaku untuk export
, bagaimanapun. Jadi, jika Anda ingin mengingat aturan sederhana, selalu gunakan tanda kutip ganda di sekitar substitusi variabel.