是否可以通过命令 "dump" 所有 bash 特殊变量,例如 env?

Is it possible to "dump" all of the bash special variables via a command, like env?

#!/bin/bash
env

这吐出一堆环境变量。 $0、$@、$_等不输出。有没有办法将它们转储出来,类似于 envset 转储其余环境的方式?我不是说 echo [=15=] 之类的东西,我想查看当前状态下所有可能的特殊变量,而不是直接调用它们。

不,没有自动执行此操作的现有功能。您必须自己枚举变量——但这很容易,因为只有几个:What are the special dollar sign shell variables?

内置变量包含在 set 命令的输出中。 ([=12=]$@ 根本不是变量,即使是特殊变量,所以它们不包括在内——但是 $_$BASH_ALIASES$BASH_SOURCE$BASH_VERSINFO$DIRSTACK$PPID 以及 内置变量的所有其他内容都存在)。

[=12=]$*$@等不是内置变量;它们是特殊参数。语义完全不同(您可以使用 declare -p 来打印变量的值,但不能打印特殊参数的值;如果重新分配,许多内置变量将失去其特殊行为,而特殊参数永远不会成为分配的目标; 等)。

http://wiki.bash-hackers.org/syntax/shellvars涵盖内置变量和特殊参数。


如果您的目标是生成当前 shell 状态的日志,我建议如下:

(set; set -x; : "[=10=]" "$@") &>trace.log

set转储实际上内置变量(包括$_)的东西,以及[=的set -x日志50=] : "[=27=]" "$@" 将包含足够的信息来重现所有基于您的位置参数("$*""$@" 等)的特殊参数;而 set 的输出将包括所有其他状态。