![如果您在另一个 shell 中更改环境变量,它在其他 shell 中会发生变化还是保持不变?](https://linux22.com/image/117499/%E5%A6%82%E6%9E%9C%E6%82%A8%E5%9C%A8%E5%8F%A6%E4%B8%80%E4%B8%AA%20shell%20%E4%B8%AD%E6%9B%B4%E6%94%B9%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%EF%BC%8C%E5%AE%83%E5%9C%A8%E5%85%B6%E4%BB%96%20shell%20%E4%B8%AD%E4%BC%9A%E5%8F%91%E7%94%9F%E5%8F%98%E5%8C%96%E8%BF%98%E6%98%AF%E4%BF%9D%E6%8C%81%E4%B8%8D%E5%8F%98%EF%BC%9F.png)
如果我在 bash 中创建一个环境变量,例如 SPORT=baseball,然后切换到 tcsh 并将其更改为“running”。如果我改回 bash,SPORT 会显示为“正在运行”吗? (我会自己尝试,但我只有 bash)
答案1
这是一个实际的实验,它完全符合您的要求;它运行bash
,设置环境变量,然后启动tcsh
并更改其值。然后它检查 中的值bash
。
#!/bin/bash
export SPORT=baseball
printf 'SPORT is "%s"\n' "$SPORT"
tcsh -c 'echo $SPORT; setenv SPORT archery; echo $SPORT'
printf 'SPORT is "%s"\n' "$SPORT"
运行此bash
脚本,调用tcsh
将导致
SPORT is "baseball"
baseball
archery
SPORT is "baseball"
但我们甚至不必切换到tcsh
查看其实际效果,只需(...)
在我们的bash
脚本中引入一个具有单独环境的子 shell 就足够了:
#!/bin/bash
export SPORT=baseball
printf 'SPORT is "%s"\n' "$SPORT"
(
echo "$SPORT"
export SPORT=archery
echo "$SPORT"
)
printf 'SPORT is "%s"\n' "$SPORT"
输出将保持不变。
一种环境不可能影响另一种环境但有一个例外:新环境继承父环境的环境变量。子 shell(如上一个示例)也继承未导出的 shell 变量。
答案2
那不是环境变量是什么方法。 “环境”特定于流程。它可能(也可能不会)被从该进程派生的其他进程继承,具体取决于各种情况。修改正在运行的进程的环境不会影响其他正在运行的进程。*
了解环境变量的含义POSIX 规范。 (并了解本文档的目的是实施者,而不是针对用户。)
*或者至少,为此设计一个例外需要一些非常好的低级编码技能。我不知道C语言是否可行;也许有共享内存。但如果没有明确地以这种方式设计,这种情况就不会发生。