【问题标题】:bash - print env vars in the order they were setbash - 按设置的顺序打印环境变量
【发布时间】:2014-06-13 12:13:11
【问题描述】:

这个问题与 bash shell 相关

首先,我知道如何查看当前设置的环境变量。

我想知道如何按照设置的顺序列出当前设置的环境变量。有点像“ls -lt”,但用于环境变量。

这可能吗?

编辑:很多人问我为什么需要这个。

我做了很多调试、代码移植、修复等工作。这需要我尝试编写并不总是很好的第三方代码。在成功构建的过程中,我可能需要设置、覆盖一些环境变量。我很擅长记录我在做什么,这样我就可以追溯我的步骤。但有时我会忘记或错过记录我的步数。

出于很好的原因,我们的环境有大量的环境变量。

那时我可以捕获整个环境变量,但这对我没有多大帮助。如果 bash 有办法按照设置的顺序列出环境变量,我可以清楚地识别我设置的内容。

另外,我同意 bash 没有理由跟踪这一点。但我希望它有一个内部的环境变量堆栈,它会自动按后进先出排序。但我想这太乐观了。

感谢大家。

【问题讨论】:

  • 我不相信它是。没有。
  • 您是否有一套特定的环境变量,或者您想为整个环境执行此操作?
  • 我想不出 bash 跟踪该信息的任何特殊原因。
  • 为什么你想要这个?听起来像是 X-Y 问题。
  • 你需要这个做什么?如果它只是为了您个人的 bash 使用,您可以使用别名 export 来包含这样的功能:function trackenv_export() { export "$@" && echo "$*" >> "$HOME"/.env_track; }; alias export=trackenv_export。但这很混乱,可能不是你想要的。

标签: linux bash


【解决方案1】:

正如@pmos 在评论中所建议的那样,您可能能够破解一些在您导出某些内容时会手动跟踪的 shell 函数,但 shell 本身无法做到这一点。这就是为什么。导出使名称可用于环境。这仅对exec*e 系列函数有意义。换句话说,export 实际上只对遵循标准fork/exec 模式的新进程有意义。但这也意味着保存导出名称的数据结构不是由 shell 决定的,而是由 POSIX C 决定的。这是documentation about exec environments 的片段:

参数 envp 是一个指向以空字符结尾的字符串的字符指针数组。这些字符串应构成新过程映像的环境。 envp 数组以空指针终止。

和

extern char **environ; 被初始化为指向环境字符串的字符指针数组的指针。

假设进程按顺序将字符串添加到环境中似乎是合理的,但实际上它似乎并没有真正以这种方式工作,而且 POSIX 系统和它们一样复杂,它们做了很多事情也就不足为奇了设置、重置和取消设置。

尽管您的问题侧重于环境变量,但您的措辞让我认为您也有兴趣跟踪变量何时获得set,这与他们获得exported 时不同。这实际上 是 完全是 shell 的问题,但唉,bash(至少)似乎也没有跟踪这个。

set 似乎按字母顺序显示名称。我什至无法弄清楚外部env 命令显示它们的顺序。

【讨论】:

  • env(1) uses environ(7) 本身的排序。 setenv(3) 很可能是造成“混乱”的原因(尽管我在其代码中没有看到任何对空闲槽的搜索)。
猜你喜欢
  • 2016-03-14
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 2017-01-13
  • 2012-10-01
  • 2020-06-19
  • 1970-01-01
相关资源
最近更新 更多