我(在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命令,它才会生效。
所以我想知道这是什么原因和解决方案?感谢。
答案 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中定义的变量。
我建议使用别名来达到同样的目的。