我正在编写一个脚本,在这种情况下,如果我可以看到所有脚本定义的变量名称和值的转储,这对我确实有帮助。这是一个例子:
foo="1"
bar="2"
print_script_variables
baz="3"
print_script_variables
这将输出:
foo="1"
bar="2"
foo="1"
bar="2"
baz="3"
有类似的东西print_script_variables
存在吗?我有一种感觉,解析您正在执行的脚本是一件愚蠢的事情。
如果这不存在,我只会手动输入一堆echo
命令。这有点烦人,因为我想print_script_variables
在排除故障时移动位置,而不必担心哪些变量进入和超出范围。
这是一个 bash 脚本,但我在终端中使用 zsh,因此在两者中都可以使用的东西将是理想的。
答案1
添加到 muru 的回复中,您可以在脚本开始时存储环境变量的名称,并在调用 print_script_variables 函数时过滤掉环境变量。对于符合 POSIX 标准的方法,请使用 set 实用程序在脚本开头列出所有变量并将它们存储在临时文件中。当调用函数 print_script_variables 时,使用 diff 过滤掉不需要的变量,即
# invoke at script start
set > /tmp/file1 # assuming /tmp/file1 is a safely generated temporary file
trap 'rm -f /tmp/file1' INT TERM HUP EXIT # delete the file on SIG{INT,TERM,HUP} and EXIT
print_script_variables() {
# suppress lines unique to file1 and lines present in pipe (set output)
# that it outputs only lines added to file1, i.e. new variables
set | comm -13 /tmp/file1 - # edited; thanks to Martin for helping to save an extra file;
}
variable=20
print_script_variables
编辑
当您需要一种自动执行第一行的方法时,您可以使用点(或来源)用于在脚本开头自动执行该行的实用程序。您应该将第一行和函数定义存储在文件中,例如print_script_variables
:
set > /tmp/file1
trap 'rm -f /tmp/file1' INT TERM HUP EXIT
print_script_variables() {
set | comm -13 /tmp/file1 -
}
并在脚本开头获取该文件,如下所示
. print_script_variables
variable=20
print_script_variables()
答案2
这是使用 grep 过滤继承变量的另一个选项。
#!/usr/bin/env bash
# Store names of inherited variables (by definition, exported)
readonly GREP_FILTERS=$(env | cut -d= -f1 | xargs printf " -e %s" )
print_script_vars() {
declare -p | grep -v -E $GREP_FILTERS
}
使用声明-p如果你想查看所有 shell 变量,或者环境如果只对导出变量感兴趣。
答案3
Adam Mlodzinski 改进的代码
#!/bin/sh
# Store names of inherited variables (by definition, exported)
readonly GREP_FILTERS=$(env | cut -d= -f1 | xargs printf " -e %s" )
print_script_vars() {
declare -p | grep -v -E $GREP_FILTERS | sed 's/declare -[^ ]\{1,2\} //' | grep =
}
variable=20
print_script_vars