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