观察到一个我不明白的有趣的 bash 行为。
基本上,当在 bash 中链接命令时,两个命令之间是否有分号似乎会对 bash 行为产生影响。特别是下面两个例子,一个可以读取Python中的env变量,另一个则不能
yuli@yuli-desktop:~$ A=1; python3
Python 3.8.10 (default, Nov 26 2021, 20:14:08)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ['A']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.8/os.py", line 675, in __getitem__
raise KeyError(key) from None
KeyError: 'A'
>>> exit()
Run Code Online (Sandbox Code Playgroud)
在新的 bash 进程中:
yuli@yuli-desktop:~$ A=1 python3
Python 3.8.10 (default, Nov 26 2021, 20:14:08)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>>
>>>
>>> os.environ['A']
'1'
Run Code Online (Sandbox Code Playgroud)
在第二个示例中,您没有链接两个命令。
当您在 bash 中运行命令时,您可以通过在命令行前添加变量赋值来设置每个命令的环境变量,如下所示:
A=1 B=2 COLOR=red python3
Run Code Online (Sandbox Code Playgroud)
在这种情况下,这些变量 ( A
, B
, COLOR
) 将在命令环境中可用:
>>> os.getenv('COLOR')
'red'
Run Code Online (Sandbox Code Playgroud)
在第一个示例中,分号将命令行分成两个独立的命令。由于该python3
命令没有与之关联的变量分配,因此您没有设置任何环境变量。相反,您设置了一个 shell 本地变量A
,该变量在 shell 中可见,但在任何子进程中不可见。
您可以在bash 手册页的“SHELL GRAMMAR”部分中查看有关此内容的文档。
在评论中,ErikMD 提到了export
内置的 shell,它用于设置持久环境变量:
$ export COLOR=red
Run Code Online (Sandbox Code Playgroud)
或者:
$ COLOR=red
$ export COLOR
Run Code Online (Sandbox Code Playgroud)
以这种方式设置的环境变量将持续存在,直到显式取消设置为止,并将在所有后续命令中可用。与作为命令调用一部分的变量集(如本答案前面所讨论的)进行对比,变量集仅在该命令的持续时间内可用。
归档时间: |
|
查看次数: |
271 次 |
最近记录: |