【问题标题】:how to list the variables defined by a Bash function, including those pre-existing variables that are unchanged in value by the function如何列出由 Bash 函数定义的变量,包括那些在函数中值不变的预先存在的变量
【发布时间】:2013-11-27 11:36:16
【问题描述】:

我想运行一个定义一些变量的 Bash 函数,然后在函数运行后,列出它“尝试”定义的所有变量。这样的列表将包括那些预先存在但函数值未更改的变量的名称。你能指出我正确的方向吗?

编辑:我在下面添加了一些代码,以进一步解释我想要完成的工作并提供灵感。

#!/bin/bash

variable1="zappo"

#listOfVariables1="$(printenv)"
listOfVariables1="$(set)"

function1(){
    variable1="zappo"
}

function1

#listOfVariables2="$(printenv)"
listOfVariables2="$(set)"

echo -e "\ncomparing initial list of variables with final list of variables...\n"
diff <(echo "${listOfVariables1}") <(echo "${listOfVariables2}")

【问题讨论】:

    标签: bash list function variables


    【解决方案1】:

    set 命令将显示所有 shell 环境变量,包括那些用户定义的变量。

    要在函数前后轻松查看变量列表(可能很长),您可以使用diff 例如

    set > set_before.tmp
    my_func
    set > set_after.tmp    
    diff set_before.tmp set_after.tmp
    

    【讨论】:

    • 感谢您的帮助。我在上面添加了一些代码来尝试按照您的建议使用set。我不知道如何继续以获得在脚本末尾包含 variable1 的列表。
    • 为什么在脚本的结尾处需要variable1?原帖中没有提到这一点。
    【解决方案2】:

    尝试在执行结束时编辑您的 bash 函数以打印环境。然后,您可以将获得的 (diff list1 list2) 列表与没有脚本的 printenv 结果进行比较。

    #!/bin/bash
    printenv > /tmp/list1
    
    {
        cat $(which your_function)
        echo 'printenv > /tmp/list2'
    } >/tmp/fake.sh
    
    chmod +x /tmp/fake.sh
    /tmp/fake.sh
    
    diff /tmp/list1 /tmp/list2
    

    另外,如果你只需要设置这个变量,你需要运行. $(which your_function)

    如果您简单地运行your_function,则不会更改父范围内的变量。

    【讨论】:

    • 感谢您的帮助。我在上面添加了一些代码来尝试按照您的建议使用printenv。我不知道如何继续以获得在脚本末尾包含 variable1 的列表。
    • 尝试在我的回答中使用代码。将your_function 替换为您想要运行的函数。
    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 2021-12-07
    • 2018-07-11
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多