Странные переменные окружения, которых нет в хэше Perl ENV - PullRequest
3 голосов
/ 18 апреля 2019

Perl имеет доступ к некоторым переменным среды:

> echo $HOST
xtt006
> perl -E 'say $ENV{HOST}'
xtt006
> perl -E 'say `echo \$HOST`'
xtt006

Но, очевидно, есть еще один класс переменных среды, которых нет в хэше ENV:

> echo $env
opsd
> perl -E 'say $ENV{env}'
(no response from Perl)
> perl -E 'say `echo \$env`'
(no response from Perl)

Что с этим?Есть ли другой метод, с помощью которого Perl может получить значение $ env?

Ответы [ 3 ]

3 голосов
/ 18 апреля 2019

С % ENV в perlvar (мой акцент)

Хэш %ENV содержит ваше текущее окружение .

Среда унаследована от процесса, который запустил процесс Perl, здесь - оболочка.

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

Переменная, созданная так же, как в примере вышедоступно только для текущей оболочки.Это локальная переменная: дочерние процессы текущей оболочки не будут знать об этой переменной.Чтобы передать переменные в подоболочку, нам нужно экспортировать их с помощью встроенной команды export.Переменные, которые экспортируются, называются переменными среды .Установка и экспорт обычно выполняется за один шаг:

export VARNAME="value" 

(мой акцент) По вашему описанию кажется, что $env добавляется как локальная переменная (с set), которая затемтакже необходимо экспортировать (export env), чтобы их можно было увидеть в однострочнике.

Переменные среды могут быть перечислены с env или printenv, тогда как set перечисляет все переменные, как локальныеи окружающие.


Вышесказанное относится к оболочке bash.Понятие «окружающая среда» то же самое в других оболочках, и то же самое рассуждение применимо и там;чтобы переменная была видна в дочерних процессах, нам нужно сделать ее глобальной («переменная окружения»).Разница в том, как это сделать.

В csh / tcsh используйте

setenv env "value"

вместо set var = "value", что создаст локальную переменную.


Помимо использованияГлобальная ("среда") переменная вместо локальной, можно передать переменную в код Perl.См. этот пост и этот пост для примеров того, как сделать это с однострочниками.Если реальный скрипт вызывается, тогда заставьте его принимать аргументы;стандартный и лучший способ - Getopt :: Long ,

Это не является специальным требованием для пользователей;они используют ваш сценарий и должны вызывать его соответствующим образом.

3 голосов
/ 18 апреля 2019

Попробуйте export извлечь вашу переменную из оболочки.Это переместит его из списка переменных оболочки в среду, которую смогут видеть все подпроцессы.

export env
perl -E 'say $ENV{env}'

Это должно заставить его отображаться.

2 голосов
/ 19 апреля 2019

Так же, как в Perl есть личные переменные (my $x) и переменные окружения ($ENV{Y}), так и оболочка.

$ perl <<'.'
my $x = "x";
$ENV{Y}="Y";
system 'echo "<$x> <$Y>"';
.
<> <Y>

$ sh <<'.'
x=x
export Y=Y
perl -le'print "<$x> <$ENV{Y}>";'
.
<> <Y>

$ csh <<'.'
set x x
setenv Y Y
perl -le'print "<$x> <$ENV{Y}>";'
.
<> <Y>

Поддержка частных переменных - это хорошо, а не странновещь.

В вашем примере $HOST - это переменная окружения (в верхнем регистре по соглашению), а $env - приватная переменная (в нижнем регистре по договоренности).


sh и bash

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

Чтобы создать переменную окружения, вы переводите частную переменную в средуиспользуя export.

VAR=val
export VAR
perl -e'...$ENV{VAR}...'

или

export VAR
VAR=val
perl -e'...$ENV{VAR}...'

Повышение и назначение могут быть объединены.

export VAR=val
perl -e'...$ENV{VAR}...'

Приведенные выше подходы изменяют среду оболочкии всех последующих детей он создает.Следующий подход может использоваться для изменения среды конкретного ребенка:

VAR=val perl -e'...$ENV{VAR}...'

Этот подход также может использоваться для эффективного продвижения закрытой переменной:

var=val
VAR="$var" perl -e'...$ENV{VAR}...'

csh и tcsh

В этих оболочках используется различный синтаксис для установки частных переменных и переменных среды.

Для установки частной переменной используется set.

set var val

Чтобы установить переменную среды, используется setenv.

setenv VAR val
perl -e'...$ENV{VAR}...'

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

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