2012-11-15 2 views
5

Я пытаюсь установить переменную среды с помощью Perl. Он должен экспортировать эту переменную за пределами (в текущей оболочке) не только в сценарии.Настройка переменной окружения с использованием perl

Я пробовал:

`setenv X1 /p/fsd` 

system("setenv X1 /p/fsd") == 0 or die "failed:$?" 

system command "setenv X1 /p/fsd" failed: -1 

$ENV{"X1"} = "/p/fsd"; 

Ничто, кажется, работает.

Если это важно, я пользуюсь TCSH.

+0

Возможный дубликат [Установка переменной окружения через Perl-скрипт] (http://stackoverflow.com/questions/19192682/setting-an-environment-variable-through-a-perl-script) –

ответ

10
$ENV{"X1"} = "/p/fsd"; 

- правильный путь.

испытания в perlconsole:

Perl> $ENV{X1} = "/p/fsd"; 
/p/fsd 

Perl> system('echo $X1'); 
/p/fsd 
0 

ПРИМЕЧАНИЕ

  • одиночные кавычки (или backslashing) требуется на echo $X1 для предотвращения perl интерполировать он сам.
  • вы не можете изменить ENV родительской оболочки, см http://www.perlmonks.org/?node_id=684685
+0

Это будет работать только а скрипт работает, правильно? Когда скрипт перестанет, они исчезнут. То, что я пытаюсь сделать, - это переменная окружения 10-15 в SHELL, и они часто обновляются. Поэтому вместо того, чтобы устанавливать их вручную, я думал списать его. – user1793023

+0

Это принцип подоболочки. Если вы убиваете отца, вы тоже убиваете сына, это печально, но это жизнь. –

+0

Добавлена ​​ссылка для объяснений относительно подоболочек и родителей. –

3

Потому что нет никаких специальных символов в setenv X1 /p/fsd,

system("setenv X1 /p/fsd") 

эквивалентно

system("setenv", "X1", "/p/fsd") 

Это неисправного, потому что есть нет программы с именем setenv. Если эта оптимизация не существует, вы получаете другой результат *. В этом случае,

system("setenv X1 /p/fsd") 

будет эквивалентно

system("sh", "-c", "setenv X1 /p/fsd") 

Это не будет работать либо потому, что sh не имеет setenv команду. Таким образом, вы можете использовать следующее:

system("tcsh", "-c", "setenv X1 /p/fsd") 

Но это было бы бессмысленно. Вы должны создать оболочку, установить одну из ее переменных. Затем оболочка выходит и ее переменные перестают существовать.

Если вы хотите установить ENV вар видели на Perl и его детей, просто использовать

$ENV{X1} = "/p/fsd";   # Until end of program 

или

local $ENV{X1} = "/p/fsd"; # Until end of scope 

* — Оптимизированный код не должен вести себя иначе, чем unoptimised кода, но поскольку оптимизация просто изменяет какую ошибку вы получаете, это приемлемо.

1

Как уже упоминалось в других ответах, вы не можете установить переменную среды в родительском элементе из дочернего элемента. Однако вы можете сделать что-то сложное в perl, а затем передать конечный результат обратно в устанавливаемую оболочку.Например, в tcsh:

eval `perl -le 'print q(setenv X1 /p/fsd)'` 

Вы можете сделать это чувствовать себя немного более прозрачной, например, с

alias x1.pl 'eval `x1.pl`' 
+0

'ssh-agent' имеет ту же проблему (установка переменных среды в вызывающая оболочка) и использует тот же трюк 'eval'. Он имеет даже переключатели для разных синтаксисов setenv в 'sh' и' csh' ('-s' resp.' -c'). –

2

Не менее важно знать, как установить переменную ENV, как удалить его:

delete $ENV{"X1"}; 

Это удалит переменную окружения для процесса perl и любых процессов с детьми. Но переменная среды по-прежнему будет установлена ​​для родительского процесса.

+0

Должно ли это быть * "X1" * или * X1 *? –

+0

@PeterMortensen Это эквивалент. В общем, мы оставляем цитаты, потому что это проще. Особенно с переменными окружения, потому что они все шапки и никаких специальных символов. Возможно, что кавычки необходимы, если вы используете странные специальные символы. См. [Это обсуждение] (http://stackoverflow.com/questions/401556/are-quotes-around-hash-keys-a-good-practice-in-perl) – mareoraft

Смежные вопросы