有没有办法打印 Bash 脚本中声明和使用的所有变量?
例如,printf "%s\n" "${FUNCNAME[@]}"
将打印当前执行调用堆栈中的所有 shell 函数的名称。
例如:这是我的脚本内容(肯定有很多声明的变量):
#!/bin/bash
say_hello() {
name="$1"
echo "Hello $name"
}
my_name="Luis Daniel"
my_age="29"
say_hello "$my_name"
然后,我需要记录如下内容:
my_name = Luis Daniel
my_age = 29
name = Luis Daniel
答案1
这些命令set
或declare
它们本身将打印所有 shell 变量及其值(并且还会输出函数定义)。declare -p
不会输出函数定义,但会用其类型注释每个变量(例如,-r
只读、-a
数组等)。该export
命令本身将打印环境变量(导出的 shell 变量),就像 和env
一样printenv
。
变量是否为用过的或不在当前 shell 会话内不一定会在这些命令的输出中检测到。 shellbash
有许多变量存在于任何shell 会话,例如RANDOM
和EUID
,无论是否使用它们。declare
调用时,变量也可能在当前作用域中不可用,例如,如果它是函数中的局部变量,或者它已经是unset
,或者如果它是在不再活动的子 shell 中声明的。
如果您想查看在特定脚本中创建的变量,则必须declare -p
在脚本开头保存 例如 的输出,然后将其与脚本末尾(或您的任何地方)对同一命令的另一个调用进行比较我想调查当前声明的变量)。
例子:
#!/bin/bash
tmpfile=$(mktemp)
declare -p >"$tmpfile"
say_hello() {
name="$1"
echo "Hello $name"
}
my_name="Luis Daniel"
my_age="29"
say_hello "$my_name"
declare -p | diff "$tmpfile" -
rm -f "$tmpfile"
运行它:
$ bash script.sh
Hello Luis Daniel
46c46,49
< declare -- _=""
---
> declare -- _="Luis Daniel"
> declare -- my_age="29"
> declare -- my_name="Luis Daniel"
> declare -- name="Luis Daniel"
请注意,由于在第二次调用 时不可用,因此在函数中声明name
为变量会产生local
declare -p
Hello Luis Daniel
46c46,48
< declare -- _=""
---
> declare -- _="Luis Daniel"
> declare -- my_age="29"
> declare -- my_name="Luis Daniel"