2016-06-12 2 views
-1

Я пытался установить имя переменной оболочки с помощью скрипта perl.Установить переменную оболочки с помощью скрипта perl

Но он не работал нормально.

system("variable_name=\"variable_value\""); 
`variable_name=\"variable_value\"`; 

Любой скажет мне, почему он не работал.

На самом деле мой вопрос был немного иным. Я хочу знать, как установить среду «setenv» с помощью скрипта perl. Я попытался $ENV{"VARIABLE_NAME"} = "home\/path_1\/path_2\/path_3";

Затем я огнь команды эха $ VARIABLE_NAME, то он не дает мне путь, который я поставил от PERL скрипта.

Thanks

+2

Возможные дубликаты 1 .. [Как экспортировать переменную оболочки в скрипт Perl] (http://stackoverflow.com/questions/2967762/how-to-export-a-shell-variable-within-a-perl -script), 2 .. [Установка переменной среды через скрипт Perl] (http://stackoverflow.com/questions/19192682/setting-an-environment-variable-through-a-perl-script), 3 .. [Как установить переменную среды в Perl?] (Http://stackoverflow.com/questions/1747796/how-do-i-set-an-environment-variable-in-perl) –

+0

На самом деле мой вопрос был немного другой. Я хочу знать, как установить среду «setenv» с помощью скрипта perl. Я пробовал $ ENV {"VARIABLE_NAME"} = "home \/path_1 \/path_2 \/path_3"; Затем я запускаю команду echo $ VARIABLE_NAME, тогда она не дает мне путь, который я установил из скрипта perl. Заранее благодарим вас за поддержку. –

+0

Пока неясно, что вы хотите сделать. Я бы предложил добавить автономный репроектор - то есть, в том числе * в ваш вопрос *, код, который выполняет назначение и использует это назначение, и обеспечивает как фактический вывод этого кода, так и его ожидаемый результат. –

ответ

1

Он работал. Проблема в том, что следующая команда system запускает новую оболочку, которая не знает о переменных, заданных в первой оболочке.

system 'x=value; echo $x'; # Outputs "value". 
system 'echo $x';   # Empty line - the shell with $x doesn't exist anymore. 
+0

Конечно, нет. Это совершенно другой процесс. Вам нужно сделать x переменной среды и установить ее в родительском процессе (т. Е. Внутри процесса Perl, вызывающего 'system'). – user1934428

+0

На самом деле мой вопрос был немного другим. Я хочу знать, как установить среду «setenv» с помощью скрипта perl. Я пробовал $ ENV {"VARIABLE_NAME"} = "home \/path_1 \/path_2 \/path_3"; Затем я запускаю команду echo $ VARIABLE_NAME, тогда она не дает мне путь, который я установил из скрипта perl. Заранее благодарю за вашу поддержку. –

+0

@AshutoshRawal: Работает для меня.'perl -we '$ ENV {VAR} = q (a/b/c); система q (echo $ VAR) ''. Обратите внимание, что переменные интерполируются в двойных кавычках, и Perl не знает, что вы имели в виду переменную оболочки. – choroba

3

У вас нет необходимости запускать новую оболочку для установки переменной окружения; действительно, это делает контрпродуктивным, поскольку значение не переживает оболочку, в которую она назначена (за исключением любых оставшихся в живых детей этой оболочки, которые могли унаследовать значение).

Вы можете просто установить переменную окружения непосредственно в Perl:

$ENV{"variable_name"} = "variable_value" 

Любая последующая оболочка отталкиваться от вашего скрипта PERL увидит это.

+0

Если вы хотите, чтобы переменная (ы) среды сохранялась в новой оболочке и не возвращалась из скрипта Perl, вы также могли бы сделать что-то вроде: 'system ($ ENV {'SHELL'}); kill 'KILL', getppid(); ' –

+0

@LexScarisbrick, ... а? 'system ($ ENV {'anything'})' - это ужасная идея - замена данных в строку, переданная в 'sh -c', является рецептом для уязвимостей оболочки, если значение переменной не было тщательно проверено. И я совсем не понимаю, что более общий код в вашем комментарии выше. Если вы хотите отключить подпроцесс, установите в нем переменную окружения, а затем выполните оболочку для замены этого подпроцесса perl, чтобы сделать ее явной. –

+0

Справедливая точка. Я принимал (возможно, ошибочное) предположение, что цель вопроса: «Что такое Perl-эквивалент выполнения« исходного файла »в оболочке?» Установка переменных среды внутри Perl, вызывая 'system()' для вызова новой оболочки, а затем убивая процесс, который называется Perl, эффективно это делает. Но. Как вы уже упоминали, вызов новой оболочки не должен основываться на переменной среды из-за рисков безопасности. –

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