什么时候`_` 是 bash shell 的环境变量?

Tim*_*Tim 10 bash environment-variables

Bash 手册说(手册页,我的重点):

当 Bash 调用外部命令时,该变量$_被设置为该命令的完整路径名,并在其环境中传递给该命令。

和(特殊参数):

_

( $_, 下划线。) 在 shell 启动时,设置为绝对路径名,用于调用在环境或参数列表中传递的正在执行的 shell 或 shell 脚本。随后,在扩展后扩展到上一个命令的最后一个参数。还设置为用于调用在导出到该命令的环境中执行和放置的每个命令的完整路径名。检查邮件时,此参数保存邮件文件的名称。

  1. 在 bash shell 中,我运行:

    $ bash
    $ export | grep '_=' 
    
    Run Code Online (Sandbox Code Playgroud)

    根据手册,_应该是新的bash shell的环境变量。export应该输出新 bash shell 的所有环境变量,但它不输出 _. 所以我想知道是否_是新的bash shell的环境变量?

  2. 实际上在任何 bash shell 中,都会发生同样的事情

    $ export | grep '_='
    
    Run Code Online (Sandbox Code Playgroud)

    不输出任何东西。所以我想知道是否_曾经是 bash shell 的环境变量?

  3. 比较:

    $ dash
    $ export  | grep '_='        
    export _='/bin/dash'
    
    Run Code Online (Sandbox Code Playgroud)

我的帖子的灵感来自Mike 的评论Stephane 的回复

Ste*_*itt 13

是的,_是新的 Bash shell 的环境变量;你可以通过运行看到

tr '\0' '\n' < /proc/$$/environ | grep _=
Run Code Online (Sandbox Code Playgroud)

外壳内部:显示外壳初始环境的内容。您不会在第一个 shell 中看到它,因为在它开始之前没有先前的 shell 来设置它。

$_在 Bash 内部扩展是指_特殊参数,它扩展到上一个命令的最后一个参数。(Bash 内部通过使用_shell 变量来处理这个问题,每次解析命令时都会更新该变量,但这实际上是一个实现细节。每次解析命令时它都是“未导出的”。export未显示,_因为它不是标记为导出的变量;但是,您可以在set.

在第一个示例中,新的 Bash shell 解析并执行其启动文件中的命令,因此在运行时explore | grep '-=',_已经被覆盖并标记为未导出。

dash示例中,它似乎没有执行任何启动文件,因此您将变量视为在运行 .bash 之前由 Bash 设置的环境变量dash


ilk*_*chu 9

export不带参数列出所有导出的变量_不是变量,而是作为特殊参数列出。

有点混乱,_也将是一个有效的名称为变量,不像其他特殊参数的名称。至少 Bash 4.4 允许对其进行赋值,而无需抱怨。它只是没有用,因为特殊效果会立即覆盖该值。

  • 尝试使用 `_` 作为变量很有趣;-)。它实际上是只写的,并且值会立即丢失。 (2认同)
  • @StephenKitt,但 Bash 4.4 允许将其标记为只读。或者一个整数。结果有点搞笑。 (2认同)

Hau*_*ing 5

正如您在declare -p.

bash标记$_为导出没有任何意义,因为它会自动将此变量添加到子进程的环境中,其值与它在 shell 中的值不同(当时)。

将其显示为导出只会让用户混淆外部命令的环境会发生什么。

BASH*不会导出所有“运行时变量” 。