shell导出变量不生效

qic*_*ren 4 unix linux macos shell

我(在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
Run Code Online (Sandbox Code Playgroud)

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

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

pax*_*blo 8

"正常"(proxy.sh例如)运行shell脚本会导致在子进程中运行,从而不会影响父进程的环境.

使用.source将运行在当前shell的上下文中的shell脚本,所以它能够影响环境,使用下列之一:

. proxy.sh
source proxy.sh
Run Code Online (Sandbox Code Playgroud)

另一种可能性(如果你bash至少使用的话)是创建一个别名来为你完成工作.您可以使用以下内容:

alias faster='export http_proxy=http://192.168.0.205:1099'
Run Code Online (Sandbox Code Playgroud)

这样你就可以直接输入faster命令行,它将导出该变量(在当前shell的上下文中).

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

alias faster='http_proxy=http://192.168.0.205:1099'
Run Code Online (Sandbox Code Playgroud)

然后使用:

faster your_program
Run Code Online (Sandbox Code Playgroud)

这将转化为:

http_proxy=http://192.168.0.205:1099 your_program
Run Code Online (Sandbox Code Playgroud)

这是为一个命令bash一次调用设置变量的方法.


Ant*_*ake 5

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

. ./proxy.sh
Run Code Online (Sandbox Code Playgroud)

要么:

source ./proxy.sh
Run Code Online (Sandbox Code Playgroud)

注意"." 在第一个示例中 - 按空格跟表示脚本将应用于shell.