Когда вы выполняете set -a var=99
, происходят три разные вещи (связанные с вашим вопросом):
- Задать опцию (
-a
) (обратное действие set +a
) для экспорта переменных.
- Позиционные параметры «устанавливаются» на следующие параметры (
$1
устанавливаются на var=99
).
- Подчеркивание переменной оболочки
$_
устанавливается на последний параметр (расширенный).
установить -a
Выполнение 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
на самом деле, чтобы избежать интерпретации опции (и set имеет много) со значениями, которые начинаются с тире ( -
).
Устанавливает список аргументов (список позиционных параметров) равным после --
. Это действительно во всех разумных оболочках (не в csh et al). Позиционные аргументы печатаются с помощью «$ @» (или аналогичного «$ *», не равного).
$ set -- a=1 b=2 c=3
$ echo "$@"
a=1 b=2 c=3
_ = Last_argument
И значение внутренней переменной оболочки _
изменяется на последний аргумент выполненной строки. Это НЕ верно почти для всех оболочек (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"