'_' 何时从环境中删除?

'_' 何时从环境中删除?
$ bash --norc
$ export | grep '_='
declare -x _="/bin/bash"
$ export | grep '_='
$ 

会发生什么_?是在什么时候立即退出环境的?

这与我的另一个问题有关,“为什么`_`不能导出到bash的环境中?”。

答案1

在 Bash 中,_是一个特殊参数,每次解析命令时都会将其设置为最后一个参数的值。它还具有不可导出的特殊属性,每次执行命令时都会强制执行该属性(请参阅bind_lastarg在 Bash 源代码中)。

当您使用 启动 Bash 时bash --norc,您无需执行任何命令即可进入提示符;因此_,如果它存在于环境中,则不会被覆盖。当您从 Bash 启动 Bash 时,父 Bash 会_在启动之前设置为在子环境中运行的命令;与启动时环境中存在的任何其他变量一样,_因此最终成为导出变量,并且由于没有运行任何命令,因此该变量尚未“取消导出”。这解释了为什么你的第一个export包含它。

一旦您运行命令(export在本例中是您的第一个命令),该命令_就会被覆盖并丢失其导出标志。这解释了为什么你的第二个export不显示它。

(在内部,_是一个与其他变量一样的变量;因此可以将其设置为只读或标记为整数,从而产生有趣的结果。)

相关内容