#!/bin/bash
env
这会吐出一堆环境变量。$0、$@、$_ 等不输出。有没有办法将它们倾倒出来,类似于如何env
倾倒set
环境的其余部分?我不是说任何类似echo $0
的东西,我想在不直接调用所有变量的情况下查看所有可能的特殊变量的当前状态。
#!/bin/bash
env
这会吐出一堆环境变量。$0、$@、$_ 等不输出。有没有办法将它们倾倒出来,类似于如何env
倾倒set
环境的其余部分?我不是说任何类似echo $0
的东西,我想在不直接调用所有变量的情况下查看所有可能的特殊变量的当前状态。
不,没有自动执行此操作的现有功能。您必须自己枚举变量——但这很容易,因为只有几个:什么是特殊的美元符号 shell 变量?
内置变量包含在set
命令的输出中。($0
并且$@
根本不是变量,甚至不是特殊变量,因此它们不包括在内——但是$_
, $BASH_ALIASES
, $BASH_SOURCE
, $BASH_VERSINFO
, $DIRSTACK
,$PPID
和所有其他内置变量都存在)。
$0
, $*
,$@
等不是内置变量;它们是特殊参数。语义完全不同(您可以使用declare -p
打印变量的值,但不能打印特殊参数的值;许多内置变量在重新分配时会失去其特殊行为,而特殊参数永远不会成为分配的目标;等等)。
http://wiki.bash-hackers.org/syntax/shellvars涵盖了内置变量和特殊参数。
如果您的目标是生成当前 shell 状态的日志,我建议如下:
(set; set -x; : "$0" "$@") &>trace.log
set
转储实际上是内置变量的东西(包括$_
),并且set -x
运行日志: "$0" "$@"
将包含足够的信息来重现所有基于您的位置参数的特殊参数("$*"
,"$@"
等);而来自的输出set
将包括所有其他状态。