【问题标题】:shell export variable not come into effectshell 导出变量不生效
【发布时间】:2011-12-28 08:54:09
【问题描述】:
我(在mac osx上)经常使用
导出 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变量。我必须在当前终端输入导出命令,它才会生效。
所以我想知道这是什么原因以及解决方案?谢谢。
【问题讨论】:
标签:
linux
macos
shell
unix
【解决方案1】:
export 变量只会应用于脚本——如果你想让它应用于 shell,你需要使用 source,并像这样执行脚本:
. ./proxy.sh
或:
source ./proxy.sh
注意“。”在第一个示例中,点后跟空格表示脚本将应用于 shell。
【解决方案2】:
当执行一个 shell 脚本时,一个 new shell 被启动,脚本被执行,shell 死掉。这就是为什么您看不到 shell 中定义的变量的原因。
我建议为同样的目的使用别名。
【解决方案3】:
Drakosha 已解释了您的脚本无法运行的原因以及 Anothony 已解释了如何使您的脚本运行。但是使用脚本中的导出您需要在每次打开新终端时获取脚本。更好的解决方案是在.bash_profile 或.bashrc 中添加导出
希望这会有所帮助!
【解决方案4】:
“正常”运行 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 方法,可以为命令的一个调用设置变量。