检查是否设置了环境变量及其值
Check if a env variable is set and its value
我对 env 变量有非常丰富的运行经验。
总而言之,我需要设置一个环境变量 VAR1
,我 99% 确定我 运行 命令 export VAR1=some-value
。但是,几个小时后我忘记了我是否设置了它,所以我 运行 echo $VAR1
来检查一下。并且输出正好是some-value
,确认我设置正确
但是,当我在 python 中执行此操作时:
import os
print("VAR1" in os.environ)
输出为False
。
此时我很困惑。如果我相信我的 python 输出,这意味着我使用 echo
检查环境变量的方法是错误的。是这样吗?
因为我不知道哪里出了问题,所以我无法提供可重现的代码示例。我真的很感激任何解释。
我唯一能想到的就是你设置错了,没有导出。这可以解释为什么您可以回显该值,但它没有在 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
所以只设置了VAR1,但是设置并导出了VAR2。两者都可以回显,但只有导出的显示在 Python.
中
要在命令行检查变量是否已设置和导出,请使用 export
和 grep
:
>>> export | grep VAR1
>>> export | grep VAR2
declare -x VAR2="vvv2"
>>>
真正理解 export
的作用很有帮助。当前 shell 进程启动的子进程只会继承导出的变量。因此,当您从命令行启动 Python 时,会启动一个子进程。只有导出的变量被复制到子进程中,因此 Python.
只能看到导出的变量
正是这个子进程解释了为什么您不能 运行 一个 shell 脚本来设置当前 shell 中的环境变量。因为该脚本将 运行 在子进程中,它只会影响该子进程中的变量。一旦脚本 运行s,那个子进程就消失了。主进程的变量 space 不受脚本影响。
有一种方法可以 运行 一个脚本来设置环境变量,它也可以用于 运行 一个可以访问未导出变量的脚本。那就是 运行 带有 '.' 的脚本或 'source'。当您执行 . myscript.sh
或 source myscript.sh
时,这会导致您的脚本在当前 shell 进程中成为 运行。它阻止子进程启动到 运行 脚本。因此脚本正在查看并影响主要 shell 环境。
又是一点琐事。我不确定 . myscript.sh
和 source myscript.sh
之间是否有任何区别。根据 this SO question,唯一的区别是可移植性。在 Bash 和其他现代 shell 中,没有区别,但并非所有 shell 都支持这两种变体。
我对 env 变量有非常丰富的运行经验。
总而言之,我需要设置一个环境变量 VAR1
,我 99% 确定我 运行 命令 export VAR1=some-value
。但是,几个小时后我忘记了我是否设置了它,所以我 运行 echo $VAR1
来检查一下。并且输出正好是some-value
,确认我设置正确
但是,当我在 python 中执行此操作时:
import os
print("VAR1" in os.environ)
输出为False
。
此时我很困惑。如果我相信我的 python 输出,这意味着我使用 echo
检查环境变量的方法是错误的。是这样吗?
因为我不知道哪里出了问题,所以我无法提供可重现的代码示例。我真的很感激任何解释。
我唯一能想到的就是你设置错了,没有导出。这可以解释为什么您可以回显该值,但它没有在 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
所以只设置了VAR1,但是设置并导出了VAR2。两者都可以回显,但只有导出的显示在 Python.
中要在命令行检查变量是否已设置和导出,请使用 export
和 grep
:
>>> export | grep VAR1
>>> export | grep VAR2
declare -x VAR2="vvv2"
>>>
真正理解 export
的作用很有帮助。当前 shell 进程启动的子进程只会继承导出的变量。因此,当您从命令行启动 Python 时,会启动一个子进程。只有导出的变量被复制到子进程中,因此 Python.
正是这个子进程解释了为什么您不能 运行 一个 shell 脚本来设置当前 shell 中的环境变量。因为该脚本将 运行 在子进程中,它只会影响该子进程中的变量。一旦脚本 运行s,那个子进程就消失了。主进程的变量 space 不受脚本影响。
有一种方法可以 运行 一个脚本来设置环境变量,它也可以用于 运行 一个可以访问未导出变量的脚本。那就是 运行 带有 '.' 的脚本或 'source'。当您执行 . myscript.sh
或 source myscript.sh
时,这会导致您的脚本在当前 shell 进程中成为 运行。它阻止子进程启动到 运行 脚本。因此脚本正在查看并影响主要 shell 环境。
又是一点琐事。我不确定 . myscript.sh
和 source myscript.sh
之间是否有任何区别。根据 this SO question,唯一的区别是可移植性。在 Bash 和其他现代 shell 中,没有区别,但并非所有 shell 都支持这两种变体。