Настройка переменной среды с помощью 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.


person user1793023    schedule 15.11.2012    source источник
comment
Возможный дубликат Установка переменной среды с помощью сценария Perl   -  person imz -- Ivan Zakharyaschev    schedule 30.11.2015


Ответы (4)


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

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

Протестируйте в perlconsole:

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

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

ПРИМЕЧАНИЕ

  • одинарные кавычки (или обратная косая черта) требуются на echo $X1, чтобы perl не интерполировал сам.
  • вы не можете изменить ENV родительской оболочки, см. http://www.perlmonks.org/?node_id=684685
person Gilles Quenot    schedule 15.11.2012
comment
Это будет работать только во время работы скрипта, верно? Как только сценарий останавливается, они исчезают. Я пытаюсь сделать 10-15 переменных среды в SHELL, и они часто обновляются. Так что вместо того, чтобы я устанавливал их вручную ... я думал написать сценарий. - person user1793023; 15.11.2012
comment
Это принцип подоболочки. Если убьешь отца, убьешь и сына, это печально, но такова жизнь. - person Gilles Quenot; 15.11.2012
comment
Добавлена ​​ссылка для объяснения подоболочек и родителей. - person Gilles Quenot; 15.11.2012
comment
да ... в этом случае мне, возможно, придется сменить оболочку и использовать Bash и попытаться создать сценарий с использованием сценариев оболочки, поскольку tcsh мертв для сценариев. - person user1793023; 15.11.2012
comment
Спасибо ... за то, что открыли глаза ... :) Я думал, что должен быть способ, но не похоже на использование Perl .... - person user1793023; 15.11.2012

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

delete $ENV{"X1"};

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

person jcarballo    schedule 15.11.2013
comment
Что должно быть: X1 или X1? - person Peter Mortensen; 10.10.2014
comment
@PeterMortensen Это эквивалентно. Как правило, мы опускаем кавычки, потому что это проще. Особенно с переменными среды, потому что все они заглавные и не содержат специальных символов. Возможно, кавычки необходимы, если вы используете странные специальные символы. См. это обсуждение - person mareoraft; 15.11.2014

Поскольку в 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

or

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

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

person ikegami    schedule 15.11.2012

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

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

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

alias x1.pl 'eval `x1.pl`'
person mavit    schedule 15.12.2012
comment
ssh-agent имеет ту же проблему (установка переменных среды в вызывающей оболочке) и использует тот же трюк eval. В нем даже есть переключатели для различных синтаксисов setenv в sh и csh (-s соответственно -c). - person Slaven Rezic; 15.11.2013