shell导出变量不生效

时间:2011-11-14 04:15:34

标签: linux macos shell unix

我(在mac osx上)经常使用

  

export http_proxy = http://192.168.0.205:1099

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

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

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

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

4 个答案:

答案 0 :(得分:8)

运行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方法,只为一个调用命令设置变量。

答案 1 :(得分:5)

导出变量仅适用于脚本 - 如果要将其应用于shell,则需要使用source,并执行脚本,如下所示:

. ./proxy.sh

或:

source ./proxy.sh

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

答案 2 :(得分:3)

Drakosha& amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; Anothony解释了如何使你的脚本工作。但是在脚本中导出时,每次打开新终端时都需要获取脚本。更好的解决方案是在.bash_profile.bashrc中添加导出 希望这有帮助!

答案 3 :(得分:2)

执行shell脚本时,会启动 new shell,执行脚本,shell就会死掉。这就是为什么你没有看到你的shell中定义的变量。

我建议使用别名来达到同样的目的。