Ketika Anda mengeksekusi set -a var=99
, tiga hal berbeda terjadi (terkait dengan pertanyaan Anda):
- Opsi yang disetel (
-a
) (terbalik dengan melakukan set +a
) untuk mengekspor vars.
- Parameter posisi "diatur" untuk mengikuti opsi (
$1
set ke var=99
).
- Garis bawah variabel shell
$_
diatur ke parameter terakhir (diperluas).
set -a
Eksekusi set -a
menandai semua variabel berikutnya (baru atau diubah) yang diekspor (dalam semua shell, kecuali csh
dan beberapa shell terkait).
$ set -a
$ myvariable=wer
$ env | grep myvariable
myvariable=wer
Untuk memulihkan dari pengaturan ini, cukup ubah -
ke +
:
$ set +a
$ unset myvariable # to erase it from the environment if it
# was exported before the change of set +a
$ myvariable=456544654 # A new value of the variable.
$ env | grep "variable" # No output means the var does not exist
# in the current environment
set var = 99
Yang sebenarnya harus set -- var=99
menghindari interpretasi opsi (dan set memiliki banyak) dengan nilai-nilai yang dimulai dengan tanda hubung ( -
).
Atur daftar argumen (daftar parameter posisi) ke yang setelah --
. Itu berlaku di semua shell yang masuk akal (tidak dalam csh et al). Argumen posisional dicetak dengan "$ @" (atau "$ *" yang serupa, tidak sama).
$ set -- a=1 b=2 c=3
$ echo "$@"
a=1 b=2 c=3
_ = last_argument
Dan, nilai variabel shell internal _
berubah menjadi argumen terakhir dari baris yang dieksekusi. Itu TIDAK benar di hampir semua shell (jsh, ash, yash, dash, lksh, mksh, ksh93, attsh dan tentu saja csh dan tcsh) kecuali bash.
$ echo one two last argument
one two last argument
$ echo "$_"
argument
$ echo This is a new: last_argument
This is a new: last_argument
$ echo "$_"
last_argument
Harap perhatikan bahwa nilai dalam $_
adalah nilai setelah ekspansi:
$ a="A New_Argument"
$ echo Something else to test: "$a"
Something else to test: A New_Argument
$ echo "$_"
A New_Argument
Itu sebabnya ketika Anda mengeksekusi:
$ set -a myvar=99; set | grep 'myvar'
_=myvar=99
Anda mendapatkan deskripsi variabel shell '$ _'. Ini juga berfungsi:
$ set -a myvar=99; declare -p _
declare -- _="myvar=99"