Доступ к переменной оболочки в программе Perl - PullRequest
2 голосов
/ 06 августа 2011

У меня есть этот сценарий Perl:

#!/usr/bin/perl

$var = `ls -l \$ddd` ;
print $var, "\n";

И ddd - это переменная оболочки

$ echo $ddd
arraytest.pl

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

Что здесь происходит?Обратите внимание, что в сценарии Perl я экранирую $ ddd в обратных чертах.

Ответы [ 3 ]

5 голосов
/ 06 августа 2011

Переменная $ddd не установлена ​​* в оболочке, которую вы вызываете из скрипта Perl.

Обычные переменные оболочки не наследуются подпроцессами. Переменные среды:

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

ddd=arraytest.pl ; export ddd # sh

export ddd=arraytest.pl       # bash, ksh, zsh

setenv ddd arraytest.pl       # csh, tcsh

Это сделает переменную окружения $ddd видимой из вашего скрипта Perl. Но тогда, вероятно, имеет больше смысла ссылаться на него как $ENV{ddd}, а не передавать литеральную строку '$ddd' в оболочку и позволять ей расширять ее:

$var = `ls -l $ENV{ddd}`;
3 голосов
/ 06 августа 2011

Вы забыли export ddd:

Пометить каждое имя для передачи дочерним процессам в среде.

Итак ddd не доступно автоматически для дочерних процессов.

2 голосов
/ 06 августа 2011

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

$var = `ls -l $ENV{ddd}`;

/ edit - работает, проверено, конечно, ddd нужно экспортировать перед запуском скрипта

export ddd='arraytest.pl'
perl script.pl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...