#!/bin/bash
env
这吐出了一堆环境变量。 $0、$@、$_ 等不输出。 有没有办法将它们转储出来,类似于env
或set
转储环境其余部分的方式? 我的意思不是echo $0
之类的东西,我想在当前状态下查看所有可能的特殊变量,而无需直接调用所有变量。
不,没有现有的函数可以自动执行此操作。 你必须自己枚举变量——但这很容易,因为只有几个:什么是特殊的美元符号外壳变量?
内置变量包含在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
转储实际内置变量的东西(包括$_
(,运行: "$0" "$@"
的set -x
日志将包含足够的信息来重现所有基于位置参数的特殊参数("$*"
,"$@"
等(;而set
的输出将包括所有其他状态。