shell导出variables不生效

我(在mac osx上)经常使用

导出http_proxy = http://192.168.0.205:1099

代理http连接以获得较高的下载速度。 为了方便起见 ,我编写了一个名为proxy.shshell文件来执行此操作:

#!/bin/sh export http_proxy=http://192.168.0.205:1099 

在下载之前,我执行了proxy.sh shell命令,但是我发现它并没有生效。它在当前的commnad窗口(terminal)中丢失了http_proxyvariables。 我必须在当前terminalinputexport命令,才会生效。

所以我想知道这是什么原因和解决scheme? 谢谢。

运行一个shell脚本“通常”(例如proxy.sh )会导致在子进程中运行,从而不会影响父进程的环境。

使用.source将在当前shell的上下文中运行shell脚本,因此可以使用以下其中一种方法来影响环境:

 . proxy.sh source proxy.sh 

另一种可能性(如果你至少使用bash )是创建一个别名来为你工作。 你可以使用像这样的东西:

 alias faster='export http_proxy=http://192.168.0.205:1099' 

这样你就可以在命令行上输入faster的命令,并且可以输出该变量(在当前shell的上下文中)。

您也可以允许一次性设置,如:

 alias faster='http_proxy=http://192.168.0.205:1099' 

然后使用:

 faster your_program 

这将转化为:

 http_proxy=http://192.168.0.205:1099 your_program 

这是一个bash方式来设置一个变量只是一个命令的调用。

导出变量只适用于脚本 – 如果你想将它应用到shell,你需要使用源代码,并执行脚本,如下所示:

 . ./proxy.sh 

要么:

 source ./proxy.sh 

注意“。” 在第一个例子中,空格后面的点表示脚本将应用于外壳。

你的脚本不能正常工作的原因已经由Drakosha解释了,Anothony解释了如何使你的脚本工作。 但是,在脚本中输出时, 每次打开新终端时都需要输入脚本 。 更好的解决方案是将输出添加到.bash_profile.bashrc
希望这可以帮助!

当执行一个shell脚本时,一个新的 shell被启动,脚本被执行,并且shell死亡。 这就是为什么你没有看到你的shell中定义的变量。

我建议使用别名出于同样的目的。