2011-11-14 121 views
2

我(在Mac OSX上)经常使用外壳出口变量不会生效

出口HTTP_PROXY = HTTP://192.168.0.205:1099

以代理HTTP连接得到highed下载速度。为了让事情变得简单,我写了一个名为proxy.sh做这个shell文件:

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

我立即下载之前,我执行proxy.sh shell命令,但我发现它不是我以前不生效它在当前的commnad窗口(终端)中丢失了http_proxy变量。我必须在当前终端输入export命令,它才会生效。

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

回答

7

“正常”运行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方式为变量设置一个一个调用的命令。

+0

非常感谢。 – qichunren

5

出口变量将只适用于脚本 - 如果你想让它应用到外壳,你需要使用源,并执行脚本像这样:

. ./proxy.sh 

或:

source ./proxy.sh 

注意“。”在第一个例子中 - 空格后跟点表示脚本将应用于shell。

+0

非常感谢。 – qichunren

2

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

我建议为同一目的使用别名。

+0

非常感谢。 – qichunren

3

您的脚本无法正常工作的原因已由Drakosha解释&如何使您的脚本工作已由Anothony解释。但是,在脚本中输出时,每次打开新终端时都需要输入脚本。更好的解决方案是将输出添加到.bash_profile.bashrc
希望这有助于!

+0

非常感谢。 – qichunren