переменная экспорта оболочки не вступает в силу - PullRequest
4 голосов
/ 14 ноября 2011

Я (на Mac OSX) часто использую

export http_proxy = http://192.168.0.205:1099

к прокси-соединению http, чтобы получить высокую скорость загрузки. Чтобы было проще things Я написал файл оболочки с именем proxy.sh , чтобы сделать это:

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

Перед загрузкой я выполняю команду оболочки proxy.sh, но обнаружил, что она не вступила в силу. Она потеряла переменную http_proxy в текущем окне связи (терминале). Я должен набрать команду экспорта в текущем терминале, она вступит в силу.

Итак, я хочу знать, в чем причина этого и решения? спасибо.

Ответы [ 4 ]

8 голосов
/ 14 ноября 2011

Запуск сценария оболочки "обычно" (например, с proxy.sh) приводит к тому, что он выполняется в подпроцессе, поэтому он не может влиять на среду родительского процесса.

Использование . или source запустит сценарий оболочки в контексте текущей оболочки, поэтому сможет повлиять на среду, используя одно из следующих действий:

. proxy.sh
source proxy.sh

Другая возможность (если вы используете, по крайней мере, bash) - создать псевдоним, который сделает всю работу за вас. Вы можете использовать что-то вроде:

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

, так что вы можете просто набрать faster в командной строке, и она будет экспортировать эту переменную (в контексте текущей оболочки).

Вы также можете разрешить одноразовые настройки, такие как:

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

и затем используйте:

faster your_program

что бы перевести на:

http_proxy=http://192.168.0.205:1099 your_program

Это bash способ установить переменную только для one вызова команды.

5 голосов
/ 14 ноября 2011

Переменная экспорта будет применяться только к сценарию - если вы хотите применить ее к оболочке, вам нужно использовать исходный код и выполнить сценарий следующим образом:

. ./proxy.sh

или:

source ./proxy.sh

Обратите внимание на "." в первом примере - точка, следующая за пробелом, означает, что скрипт будет применяться к оболочке.

3 голосов
/ 14 ноября 2011

Причина, по которой ваш скрипт не работает, была объяснена Дракошей, а как заставить его работать, была объяснена Анотонией.Но с экспортом в скрипте вам нужно использовать свой скрипт каждый раз, когда вы открываете новый терминал .Лучшим решением будет добавить экспорт в .bash_profile или .bashrc
Надеюсь, это поможет!

2 голосов
/ 14 ноября 2011

При выполнении сценария оболочки запускается новая оболочка, сценарий выполняется, и оболочка умирает. Вот почему вы не видите переменную, определенную в вашей оболочке.

Я предлагаю использовать псевдоним для той же цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...