在csh中"setenv"的范围与bash中的"export"有何不同?

9

根据我所了解的,csh中的setenv 和bash中的export是等同的。然而,在我使用这两种命令时发现了一些奇怪的问题。

当我打开putty并开始输入:

setenv TEMP yes
echo $TEMP  //this give me "yes"

然后我进入bash并输入以下内容:

echo $TEMP //this give me "yes" as well

然而,如果我按相反的顺序执行,结果将不同。具体来说,当我首先进入bash并输入命令时,

export TEMP=no
echo $TEMP //this give me "no"

然后我回到 C shell 并输入以下命令:

echo $TEMP // this give me "Undefined Variable"

它不应该也给我一个“no”吗?我有什么遗漏的吗?
谢谢!

1
你所说的“then I go back to csh”是什么意思?你具体输入什么来“回到csh”? - rici
csh 是我的登录 shell,所以当我在 bash 中输入 "exit" 时,它会返回到 csh。 - Dao Lam
4
好的,当你导出一个变量时,它会被导出到子程序,但不会被导出到父程序。当你输入“exit”时,所有变量都会消失。 - rici
如果您使用 csh 登录,则答案显然是 rici 给出的那个。您说您是 "按相反的顺序" 进行的操作,这意味着您从 csh 登录到 sh,然后再从 bash/sh 登录到 csh,并获得了这种不寻常的结果。您应该在问题中更清楚地表述这一点。 - G. Cito
1个回答

14

导出一个变量意味着该变量的副本被放置在任何新创建的子进程的环境中。它是变量的一个副本;如果子进程修改了该变量,则父进程不会看到修改。此外,如果一个子进程导出一个变量,那么它不会在父进程中可见。

因此,您的两种情况是不对称的。当您在csh中启动并导出一个变量,然后启动bash时,bash将看到已导出的变量。当您在bash中导出一个新变量,并退出bash返回csh时,所有在bash会话中创建的变量都会消失。

如果您在bash中导出一个变量,然后启动一个子csh(通过键入csh),您几乎肯定会看到导出的变量。


非常有道理!谢谢你! - Dao Lam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接