不,那里没有。

不,那里没有。

envprintenv都是外部命令,即可执行文件,而不是 bash 内置命令。它们的问题是它们输出的一些环境变量(例如_,我也想知道是否还有更多)不属于调用它们的 shell,请参阅这里

答案1

declare -x或将列出标记为导出的所有变量,正如将要export:

$ declare -x
declare -x ALTERNATE_EDITOR=""
declare -x COLORFGBG="7;0"
declare -x COMMAND_MODE="unix2003"
...
declare -x VISUAL="gvim"

它不会列出任何未导出的局部变量,但会包括从 shell 外部环境继承的变量。

declare -x -F -p将省略任何导出的函数。

答案2

请注意 Bash 手册中的措辞:“所有变量标记的我们认为进程的“环境”是系统调用envp的参数中传递的内容execve,并且只是通过此参数传递的内容。其余的只是一个幻觉。调用进程(shell 或任何其他类型的进程)可以根据其记录的行为方式对接收到的变量执行任何操作。它可以将接收到的变量传递给子进程,也可以选择不这样做。

我的目标是不存在神奇的环境变量块,它会自动从父进程传递到其子进程。父进程可以用自己的“环境”做它想做的事,将其破解,在内存中加密,将其复制到进程空间中的其他地址(Bash 就是这样做的)等。不能有任何外部机制,也不是内核机制,用于检查进程的环境(等等 - 阅读/proc/PID/environ下面的评论)。唯一重要的是导出进程应该收集碎片并根据自己的规则将环境传递给其子进程;对于 Bash,规则列在 Bash 手册中。

这意味着该文件/proc/$$/environ是欺骗性的。它不反映 shell 环境的任何更改,而只是报告 shell 在被exec父进程编辑时收到的内容。

答案3

不,那里没有。

这里有三组“变量”。

  • Bourne Again shell 从派生并执行它的任何父进程继承一组环境变量。这些仍然是 Bourne Again shell 进程在其整个生命周期中的环境变量。
  • 这些环境变量初始化第二组,即外壳变量Bourne Again shell 允许用户查看和操作诸如declare.
  • 第二组 shell 变量决定了哪些 shell 变量是标记为可导出(以及其他一些机制,超出了本答案的范围),由 Bourne Again shell 派生的子进程本身继承了哪些环境变量,以便execve在该子进程中运行外部命令。

第一组是“当前shell的环境变量”。第二组是变量,第三组是环境变量子进程的

尽管 Bourne Again shell 可以更改其进程环境变量,并使该更改对其他进程可见,正如我解释的程序可以在https://unix.stackexchange.com/a/432681/5132,实际上 Bourne Again shell 不会这样做。

类似地,Bourne Again shell 可以提供对其环境变量的访问,但它没有,仅提供对其环境变量的访问变量源自shell程序启动时的那些环境变量。

(因为这个问题,我提到了 Bourne Again shell,但事实上大多数 shell 都有类似的行为,这并不是 Bourne Again shell 所特有的。)

当然,外部程序喜欢envprintenv显示第三组变量。

要查看当前 shell 进程的环境变量,必须使用外部命令:

PS ewwww -p $$
或者

hexdump -C /compat/linux/proc/$$/environ
(仅/proc在 Linux 操作系统上)

进一步阅读

答案4

declare -p将列出一切它似乎。您的问题有点误导,因为“环境变量”从技术上讲是导出的变量,而不是导出的仅仅是本地 shell 变量。

相关内容