更长的描述

更长的描述

运行后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就是价值您正在设置(您没有设置var99)。因此,_就这样设定了。这就是正在报道的内容:

_=var=99  

这有点令人困惑,但第一个=表示对变量的赋值_,第二个是值的一部分。

还值得一提的是,该-a选项set将导致所有随后定义的变量待出口。

答案2

_=plain set 输出中行首的 表示 bash 中有一个名为(_下划线)的变量。它的值是紧随其后的=。就像设置一个名为test_varto 的变量一样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发生了不同的事情(与您的问题相关):

  1. 用于导出变量的设置选项 ( -a) (通过执行反向操作)。set +a
  2. 位置参数被“设置”为选项后面的内容($1设置为var=99)。
  3. 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

正确的答案取决于您使用的 shell:

  • 为了bash,@BobEager 所说的都适用
  • 为了zsh,它仅设置为上一个命令的最后一个参数,以及命令环境中命令的完整路径名
  • 有些贝壳像dash仅在运行交互式会话时设置此变量

其他 shell 也可能有其他特殊性。像这样,$_没有定义的在 POSIX 中,因此在使用它时应该注意潜在的可移植性问题。

旁注:如果您的目的是将值 99 分配给var并使其在后续子流程的环境中可用,则实现此目的的正确语法是:

export var=99

答案4

我注意到echo $var不会给出任何东西。 … 发生了什么?

在不太精细的印刷中重击(1), 我们发现

set[--abefhkmnptuvxBCEHPT] [-o 选项名称] [精氨酸……]
set  [+abefhkmnptuvxBCEHPT] [+o 选项名称] [精氨酸……]

            ︙
    当指定选项时,它们设置或取消设置 shell 属性。选项处理后剩余的任何参数都被视为位置参数的值,并按顺序分配给$1,$2,…… 。$n

这意味着,set -a var=99不将环境变量设置var99;它设置$1var=99.尝试echo "$1"或,echo "$*"你就会看到。

相关内容