检查是否设置了环境变量及其值

Hon*_*ang 1 python environment-variables echo

我对环境变量有一次非常奇怪的经历。

总之,我需要设置一个环境变量VAR1,我 99% 确定我运行了该命令export VAR1=some-value。然而,几个小时后我忘记了是否设置了,所以我跑去echo $VAR1查看。输出完全正确some-value,这证实了我的设置是正确的。

但是,当我在 python 中执行此操作时:

import os
print("VAR1" in os.environ)
Run Code Online (Sandbox Code Playgroud)

输出是False.

此时我很困惑。如果我相信我的 python 输出,则意味着我使用检查环境变量的方式echo是错误的。是这样吗?

因为我不知道出了什么问题,所以我无法提供可重现的代码示例。我真的很感激任何解释。

Ste*_*eve 6

我唯一能想到的是你错了,你设置了它但没有导出它。这可以解释为什么你可以回显该值,但在 Python 中却无法实现os.environ。这是一个演示:

>>> VAR1="vvv1"
>>> export VAR2="vvv2"
>>> echo $VAR1
vvv1
>>> echo $VAR2
vvv2
>>> python
Python 3.7.3 (default, Sep 16 2020, 12:18:14)
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> "VAR1" in os.environ
False
>>> "VAR2" in os.environ
True
Run Code Online (Sandbox Code Playgroud)

因此仅设置了 VAR1,但设置并导出了 VAR2。两者都可以回显,但只有导出的一个会显示在 Python 中。

要在命令行检查变量是否已设置和导出,请使用exportgrep

>>> export | grep VAR1
>>> export | grep VAR2
declare -x VAR2="vvv2"
>>>
Run Code Online (Sandbox Code Playgroud)

真正理解它的作用是有帮助的export。只有导出的变量才会被当前 shell 进程启动的子进程继承。因此,当您从命令行启动 Python 时,就会启动一个子进程。只有导出的变量才会被复制到子进程中,因此 Python 只能看到导出的变量。

正是这个子进程的问题解释了为什么您无法运行 shell 脚本来在当前 shell 中设置环境变量。因为该脚本将在子进程中运行,所以它只会影响该子进程中的变量。一旦脚本运行,该子进程就会消失。主进程的变量空间不受脚本影响。

有一种方法可以运行脚本来设置环境变量,它也可以用于运行可以访问未导出变量的脚本。即运行带有“.”的脚本 或“来源”。当您执行. myscript.sh或 时source myscript.sh,这会导致您的脚本在当前 shell 进程中运行。它阻止子进程启动来运行脚本。那么脚本就会看到并影响主 shell 环境。

另一个小琐事。我不确定 和 之间是否有任何. myscript.sh区别source myscript.sh。根据这个问题,唯一的区别是可移植性。在 Bash 和其他现代 shell 中,没有区别,但并非所有 shell 都支持这两种变体。