Answers:
当您执行时set -a var=99
,会发生三件事(与您的问题有关):
-a
)(执行相反操作set +a
)导出var。$1
设置为var=99
)。$_
设置为最后一个参数(扩展)。将所有后续(新的或更改的)变量的执行set -a
标记为已导出(在所有shell中,以及一些相关的shell 除外)。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
实际上应该set -- var=99
避免使用以破折号(-
)开头的值来解释选项(且集合有很多)。
将参数列表(位置参数列表)设置为--
。这在所有合理的shell中都有效(不适用于csh等)。位置参数用“ $ @”(或类似的“ $ *”,不相等)打印。
$ set -- a=1 b=2 c=3
$ echo "$@"
a=1 b=2 c=3
并且,内部shell变量的值_
更改为执行行的最后一个参数。这是不是真的在几乎所有的壳(JSH,灰,佳日,破折号,lksh,mksh,ksh93的,attsh当然CSH和tcsh的),除了庆典。
$ 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
您将获得有关shell变量“ $ _”的描述。这也适用:
$ set -a myvar=99; declare -p _
declare -- _="myvar=99"
下划线实际上是一个特殊的shell变量。您在这里看到的是underscore(_
)变量,其值为var=99
。它是只读的,由外壳程序维护。它是:
您的示例属于第二类。您输入:
set -a var=99
因此,最后一个参数是var=99
,那就是您要设置的值(您未设置var
为99
)。因此,_
被设置为此。这就是正在报告的内容:
_=var=99
这有点令人困惑,但是第一个=
指示变量的赋值_
,第二个指示值的一部分。
还值得一提的是,该-a
选项set
将导致导出所有随后定义的变量。
正确的答案取决于您使用的shell:
其他外壳也可能有其他特殊性。因此,$_
在没有定义在POSIX,所以一个使用它的时候应该注意潜在的可移植性问题。
旁注:如果您打算将99的值分配给var
并使它在后续子流程的环境中可用,则实现此目的的正确语法是:
export var=99
unset var;set -a; var=99
。适用于所有合理的外壳(不适用于csh等)。
我注意到
echo $var
不会有任何结果。… 发生了什么?
在bash(1)的不太精细的打印中,我们发现
set
[--abefhkmnptuvxBCEHPT
] [ 选项名称 ] [ arg …] [ ] [ 选项名称 ] [ arg …]-o
set
+abefhkmnptuvxBCEHPT
+o
specified
指定选项后,它们将设置或取消设置外壳程序属性。选项处理后剩余的所有参数都被视为位置参数的值,并按顺序分配给$1
,$2
... 。$n
这意味着set -a var=99
不要将环境变量设置var
为99
; 它设置$1
为var=99
。尝试echo "$1"
或echo "$*"
,您将看到。