Коли ви виконуєте set -a var=99
, трапляються три чіткі речі (пов'язані з вашим запитанням):
- Набір параметрів (
-a
) (зворотне виконання set +a
) для експорту vars.
- Позиційні параметри "встановлюються" у відповідності з параметрами (
$1
встановлено на var=99
).
- Підкреслення змінної оболонки
$_
встановлено на останній параметр (розгорнутий).
набір -а
Виконання set -a
відмічає всі наступні (нові або змінені) змінні як експортовані (у всіх оболонках, за винятком csh
і деяких супутніх оболонок).
$ set -a
$ myvariable=wer
$ env | grep myvariable
myvariable=wer
Для того, щоб оговтатися від цього параметра, просто змінити -
до +
:
$ 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
встановити var = 99
Що насправді повинно бути, set -- var=99
щоб уникнути інтерпретації опції (і набору є багато) зі значеннями, які починаються з тире ( -
).
Встановлює список аргументів (перелік позиційних параметрів), що знаходиться після --
. Це справедливо у всіх розумних оболонках (не в csh et al). Позиційні аргументи друкуються з "$ @" (або подібним "$ *", не рівним).
$ set -- a=1 b=2 c=3
$ echo "$@"
a=1 b=2 c=3
_ = останній аргумент
І значення змінної внутрішньої оболонки _
змінюються на останній аргумент виконаного рядка. Це НЕ вірно майже у всіх оболонках (jsh, ash, yash, dash, lksh, mksh, ksh93, attsh і звичайно csh і tcsh), крім 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
Зауважте, що значення в $_
- це значення після розширення:
$ a="A New_Argument"
$ echo Something else to test: "$a"
Something else to test: A New_Argument
$ echo "$_"
A New_Argument
Ось чому при виконанні:
$ set -a myvar=99; set | grep 'myvar'
_=myvar=99
Ви отримуєте опис змінної оболонки '$ _'. Це також працює:
$ set -a myvar=99; declare -p _
declare -- _="myvar=99"