编辑

编辑

我正在编写一个脚本,在这种情况下,如果我可以看到所有脚本定义的变量名称和值的转储,这对我确实有帮助。这是一个例子:

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

相关内容