“ _ =”是什么意思?


29

运行后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不会再包含此变量。怎么了?


Answers:


16

当您执行时set -a var=99,会发生件事(与您的问题有关):

  1. 设置选项(-a)(执行相反操作set +a)导出var。
  2. 将位置参数“设置”为选项后面的($1设置为var=99)。
  3. shell变量下划线$_设置为最后一个参数(扩展)。

设置-a

所有后续(新的或更改的)变量的执行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

设置var = 99

实际上应该set -- var=99避免使用以破折号(-)开头的值来解释选项(且集合有很多)。

将参数列表(位置参数列表)设置为--。这在所有合理的shell中都有效(不适用于csh等)。位置参数用“ $ @”(或类似的“ $ *”,不相等)打印。

$ set -- a=1 b=2 c=3
$ echo "$@"
a=1 b=2 c=3

_ = last_argument

并且,内部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"

37

下划线实际上是一个特殊的shell变量。您在这里看到的是underscore(_)变量,其值为var=99。它是只读的,由外壳程序维护。它是:

  • 在shell启动时设置,包含在参数列表中传递的正在执行的shell或脚本的绝对文件名。
  • 之后,在扩展后,它将扩展为上一个命令的最后一个参数。
  • 检查邮件时,此参数保存邮件文件的名称。
  • 它还设置为执行的每个命令的完整路径名,并放置在导出到该命令的环境中。

您的示例属于第二类。您输入:

set -a var=99  

因此,最后一个参数是var=99,那就是您要设置的(您未设置var99)。因此,_被设置为此。这就是正在报告的内容:

_=var=99  

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

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


16

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

  • 对于bash,无论@BobEager所说的适用
  • 对于zsh,它仅设置为上一个命令的最后一个参数,并且在命令的环境中设置为命令的完整路径名
  • 一些shell dash仅在运行交互式会话时才设置此变量

其他外壳也可能有其他特殊性。因此,$_没有定义在POSIX,所以一个使用它的时候应该注意潜在的可移植性问题。

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

export var=99

2
另一个正确的语法是unset var;set -a; var=99。适用于所有合理的外壳(不适用于csh等)。
箭头

1
@Arrow尽管根据Bob Eager的回答的最后一行,这会使所有随后设置/修改的变量导出,而这可能不是您想要的。
TripeHound

8

我注意到echo $var不会有任何结果。… 发生了什么?

bash(1)的不太精细的打印中,我们发现

set[ --abefhkmnptuvxBCEHPT] [ 选项名称 ] [ arg …]   [ ] [ 选项名称 ] [ arg …]-o
set+abefhkmnptuvxBCEHPT+o

            specified
    指定选项后,它们将设置或取消设置外壳程序属性。选项处理后剩余的所有参数都被视为位置参数的值,并按顺序分配给$1$2... 。$n

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.