是否可以通过命令(例如env)“转储”所有bash特殊变量?

时间:2018-09-09 01:40:20

标签: bash special-variables

#!/bin/bash
env

这会吐出一堆环境变量。 $ 0,$ @,$ _等不输出。有没有办法像envset那样转储其余的环境?我不是说echo $0之类的东西,而是要查看所有可能的特殊变量处于其当前状态,而无需直接调用它们。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

内置变量包含在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的{​​{1}}日志将包含足够的信息以再现基于位置参数(: "$0" "$@""$*"等)的所有特殊参数;而"$@"的输出将包括所有其他状态。