Используйте специальные символы внутри perl-скрипта для системных вызовов - PullRequest
0 голосов
/ 08 февраля 2011

Я пишу короткий скрипт установки на Perl, который устанавливает переменные среды пользователя для поиска определенных библиотек. Я использую функцию system() для установки переменной $PATH. Однако, поскольку для этого требуется использование специального символа $, Perl это не нравится.

system("export PATH=$PATH:/library/directory/here");

Это ничего не делает, потому что пытается заменить $PATH. Когда я выхожу из знака доллара вот так:

system("export PATH=\$PATH:/library/directory/here");

это тоже не работает.

Что я могу сделать?

Ответы [ 4 ]

1 голос
/ 09 февраля 2011

Если вы хотите обновить системную переменную PATH, используйте это:

$ENV{'PATH'}.=':/library/directory/here';

После этого / library / directory / here будет доступно через PATH для этого и всех разветвленных процессов:

...
system("echo old PATH=$PATH");
$ENV{'PATH'}.=':/library/directory/here';
system("echo new PATH=$PATH");
...
1 голос
/ 09 февраля 2011

* NIX, в отличие от Windows, имеет отдельную среду для каждого процесса.Когда вы устанавливаете PATH через систему, он изменяет его в подпроцессе.Но затем системная команда завершается, поэтому ее среда удаляется как часть очистки процесса.

Установка PATH через ENV установит его в сценарии Perl, и все процессы будут отменены. NOT установит PATH в оболочке, которая запускает скрипт.Это необходимо сделать отдельно с помощью команды source для csh и команды dot, '.' Для bash.Подробнее см. man bash.

0 голосов
/ 08 февраля 2011

При использовании двойных кавычек в perl, он заменяет переменные в строке.Использование одинарных кавычек Perl не будет интерпретировать $ внутри него.

0 голосов
/ 08 февраля 2011

используйте одинарные кавычки, например,

my $cmd = 'export PATH=$PATH:/library/directory/here';
system($cmd);

В качестве альтернативы вы можете создать bash-скрипт, который экспортирует переменную PATH.
Вы также можете использовать полный путь к скрипту, который вы пытаетесь вызвать из Perl, вместо того, чтобы вызывать программу только по имени, например. используйте / usr / env / perl вместо perl.

...