如果您在另一个 shell 中更改环境变量,它在其他 shell 中会发生变化还是保持不变?

如果您在另一个 shell 中更改环境变量,它在其他 shell 中会发生变化还是保持不变?

如果我在 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语言是否可行;也许有共享内存。但如果没有明确地以这种方式设计,这种情况就不会发生。

相关内容