我正在寻找一种方法来在脚本中确定另一个脚本设置了哪些环境变量。设置环境变量的脚本(env.sh
)有各种逻辑来检索这些变量值,我想确定这些值是否从一个版本的存储库更改到另一个版本(但我无法跟踪env.sh
only 的文件内容,因为即使它声明的环境变量发生了变化,它也可能保持不变)。
# main.sh
# Call env.sh to calculate a hash over the environment variables it has set (no idea how)
bash ./env.sh
# env.sh
export foo="foo" # could be changed directly in another version
export bar=`cat barversion` # content in `barversion` itself could change, but not env.sh
# ... more could be added, but we don't want to assume knowledge about this in main.sh
所引用的文件env.sh
可能会发生变化,从而导致导出的环境变量发生变化,进而产生不同的哈希值
# barversion
1.0
bash ./env.sh
理想情况下, in的调用main.sh
实际上并不会污染环境变量范围main.sh
(事实上bash ./env.sh
不需要这样调用。该行只是一个占位符,用来指示我遇到困难的地方)。
任何帮助或正确方向的指示都将不胜感激。
您可以尝试这样的操作,用于在子 shell 中
declare -p
打印采购前后的值:env.sh
如果您只对导出的变量感兴趣,那么您可以将每个变量更改
grep -vE '^declare -- (old|_)='
为grep '^declare -x'
,或者最好按照@pjh在评论中所建议的那样,将每个变量更改declare -p | grep -vE '^declare -- (old|_)='
为export -p
:想出一些您会满意的更深奥的名称,或者如果您认为
old
、new
和/或file
变量名称可能会被修改,则使用临时文件env.sh
。考虑一下这样的事情:
那么,为什么
< <(cat /proc/self/environ)
使用 而不是 呢</proc/self/environ
?原因是我们想要与启动 shell 的当前环境变量进行比较,而不是与它的初始环境变量进行比较。 procfs 数据仅反映初始环境,而不是当前环境;使用确保我们捕获的是启动时的cat
环境,而不是每个进程启动时的环境。cat