gpt4 book ai didi

linux - BASH:重置某些脚本使用的变量

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:28 25 4
gpt4 key购买 nike

一个微不足道的情况 - 脚本已经完成了它的执行,并且在它的途中使用的所有变量都保留了下来。我正在寻找一种方法,脚本可以仅取消设置它变量使用的所有内容,因为还有许多其他脚本设置它们的东西......'exec bash' 不是一个选项。我想象中的EG:

function setVariables { 
A="~/"
B=$(du -sh /smth)
C="tralala"
}
setVariables

function cleanup {
readarray -t args < <(setVariables)
set -u "${args[@]}"
}
cleanup

如何实现?

最佳答案

就像评论中已经建议的那样,简单的解决方案是将命令放在脚本中而不是函数中。该脚本在具有自己环境的子进程中运行,并且不会更改父进程中的任何内容。当 child 完成时,其环境中的任何东西都不会留下。

如果你需要使用一个函数,Bash 有一个 local 关键字,它使变量的作用域局限于当前函数。当函数结束时,所有变量都将重置为函数运行之前的状态(如果未设置则为未设置,如果已设置则为之前的值)。

如果您想设置变量并在函数外部设置它们,但有一种简单的方法可以将它们恢复为原始值,那么您真的必须自己构建它。看看 Python 的 virtualenv 是如何做到的,例如(一个常见且流行的示例,尽管不一定是绝对最健壮的)——它基本上将以前的值写到 deactivate 的定义中 命令禁用虚拟环境并(尝试)将事物恢复到运行 activate 之前的状态。

# bash 4+ only!
setVariables () {
declare -A _setvariables_old=([A]="$A" [B]="$B" [C]="$C")
A="~/"
B=$(du -sh /smth)
C="tralala"
}
setVariables
:
cleanup () {
local var
for var in "${!_setvariables_old[@]}"; do
printf -v "$var" "%s" "${_setvariables_old[$var]}"
done
unset _setvariables_old
}

这有点泄漏(如果 _setvariables_old 是您想要保留的变量怎么办!?)并且不知道如何取消设置;如果在您开始之前未设置某些内容,它只会恢复为空字符串。

关于linux - BASH:重置某些脚本使用的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47538813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com