运行后set -a var=99
,我可以在输出中找到一句话set
:
...
TERM=xterm
UID=0
USER=root
VIRTUAL_ENV_DISABLE_PROMPT=1
_=var=99
colors=/etc/DIR_COLORS
...
谁能告诉我“_=”是什么意思?
我注意到这echo $var
不会带来任何好处。如果我运行set -a
,那么将set
不会再次包含此变量。怎么了?
答案1
下划线实际上是一个特殊的shell变量。您在这里看到的是_
值为 的下划线 () 变量var=99
。它是只读的,由 shell 维护。这是:
- 在 shell 启动时设置,包含参数列表中传递的正在执行的 shell 或脚本的绝对文件名。
- 之后,它在扩展后扩展为上一个命令的最后一个参数。
- 检查邮件时,该参数保存邮件文件的名称。
- 它还设置为执行的每个命令的完整路径名,并放置在导出到该命令的环境中。
你的例子属于第二类。你输入的是:
set -a var=99
所以最后一个论点是var=99
就是价值您正在设置(您没有设置var
为99
)。因此,_
就这样设定了。这就是正在报道的内容:
_=var=99
这有点令人困惑,但第一个=
表示对变量的赋值_
,第二个是值的一部分。
还值得一提的是,该-a
选项set
将导致所有随后定义的变量待出口。
答案2
_=
plain set 输出中行首的 表示 bash 中有一个名为(_
下划线)的变量。它的值是紧随其后的=
。就像设置一个名为test_var
to 的变量一样12345
(在 bash 中):
$ test_var=12345
$ set | grep test_var
test_var=12345
$ declare -p test_var
test_var=12345
该特殊的 bash 变量将被设置为上一行的最后一个参数:
$ echo "Testing some" "values" "in the shell" "(only bash)" "_=myvar=hello"
Testing some values in the shell (only bash) _=myvar=hello
$ echo "$_"
_=myvar=hello
$ echo "Testing some" "values" "in the shell" "(only bash)" "_=myvar=hello"
Testing some values in the shell (only bash) _=myvar=hello
$ declare -p _
declare -- _="_=myvar=hello"
请注意二 =
在该输出中。
更长的描述
当你执行set -a var=99
,三发生了不同的事情(与您的问题相关):
- 用于导出变量的设置选项 (
-a
) (通过执行反向操作)。set +a
- 位置参数被“设置”为选项后面的内容(
$1
设置为var=99
)。 - shell 变量下划线
$_
设置为最后一个参数(展开)。
设置-a
的执行set -a
标记全部导出的后续(新的或更改的)变量(在所有 shell 中,除了csh
一些相关 shell 之外)。
$ 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
设置变量=99
这实际上应该是set -- var=99
避免解释带有以破折号()开头的值的选项(并且设置有很多)-
。
将参数列表(位置参数列表)设置为--
.这在所有合理的 shell 中都有效(在 csh 等中除外)。位置参数用“$@”(或类似的“$*”,不相等)打印。
$ set -- a=1 b=2 c=3
$ echo "$@"
a=1 b=2 c=3
#_=last_argument 并且,内部 shell 变量的值_
更改为执行行的最后一个参数。那是不是在几乎所有 shell(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
您将获得 shell 变量“$_”的描述。这也有效:
$ set -a myvar=99; declare -p _
declare -- _="myvar=99"
答案3
答案4
我注意到
echo $var
不会给出任何东西。 … 发生了什么?
在不太精细的印刷中重击(1), 我们发现
set
[--abefhkmnptuvxBCEHPT
] [-o
选项名称] [精氨酸……]
set
[+abefhkmnptuvxBCEHPT
] [+o
选项名称] [精氨酸……]︙
当指定选项时,它们设置或取消设置 shell 属性。选项处理后剩余的任何参数都被视为位置参数的值,并按顺序分配给$1
,$2
,…… 。$n
这意味着,set -a var=99
不将环境变量设置var
为99
;它设置$1
为var=99
.尝试echo "$1"
或,echo "$*"
你就会看到。