qichunren
qichunren

Reputation: 4475

shell export variable not come into effect

I (on mac osx) often use

export http_proxy=http://192.168.0.205:1099

to proxy http connection to get a highed download speed. To make things easy, I wrote a shell file named proxy.sh to do this:

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

Before I downlaod, I execute proxy.sh shell command, but I found it did't not come into effect.It lost http_proxy variable in current commnad window(terminal). I must type export command in current terminal,it will come into effect.

So I want to know what's reason for this and a solution? thanks.

Upvotes: 4

Views: 5255

Answers (4)

paxdiablo
paxdiablo

Reputation: 882716

Running a shell script "normally" (with proxy.sh for example) results in that running in a sub-process so that it cannot affect the environment of the parent process.

Using . or source will run the shell script in the context of the current shell, so it will be able to affect the environment, using one of the following:

. proxy.sh
source proxy.sh

Another possibility (if you're using bash at least) is to create an alias to do the work for you. You can use something like:

alias faster='export http_proxy=http://192.168.0.205:1099'

so that you can then simply type faster on the command line and it will export that variable (in the context of the current shell).

You could also allow for one-shot settings such as:

alias faster='http_proxy=http://192.168.0.205:1099'

and then use:

faster your_program

which would translate into:

http_proxy=http://192.168.0.205:1099 your_program

That's a bash way to set a variable for just the one invocation of a command.

Upvotes: 8

another.anon.coward
another.anon.coward

Reputation: 11405

The reason why your script does not work has been explained by Drakosha & how to make your script work has been explained by Anothony. But with the export in the script you need to source your script each time you open a new terminal. A better solution will be to add the export in .bash_profile or .bashrc
Hope this helps!

Upvotes: 3

Drakosha
Drakosha

Reputation: 12165

When executing a shell script a new shell is launched, the script is executed, and the shell dies. That's why you don't see the variable defined in your shell.

I suggest using an alias for the same purpose.

Upvotes: 2

Anthony Blake
Anthony Blake

Reputation: 5348

The export variable will only apply to the script -- if you want it to apply to the shell, you need to use source, and execute the script like so:

. ./proxy.sh

or:

source ./proxy.sh

Note the "." in the first example -- the dot follow by space means the script will apply to the shell.

Upvotes: 5

Related Questions