Выдача системных команд в perl - PullRequest
1 голос
/ 14 марта 2012

Мне трудно понять, почему следующая команда не выполняется в perl ..

system(". ./setenv.sh");

Я пробовал альтернативы, такие как

ALT 1 = system ".", "./setenv.sh";

ALT 2 = `. ./setenv.sh`;

Не уверен, что я делаю не так .. Есть идеи?

РЕДАКТИРОВАТЬ: я понял это с некоторыми из идей, упомянутых здесь, это то, что я сделал ..

system(". ./setenv.sh && <other commands that I required the env for here>");

Спасибо!

Ответы [ 3 ]

7 голосов
/ 14 марта 2012

. и source (эквиваленты) являются bash внутренними командами. Системный вызов пытается найти исполняемый файл (первый бит перед пробелом) и не находит его (. не существует как исполняемый файл, поскольку это внутренняя команда bash).

Вы должны выполнить bash (или оболочку, которую вы используете) напрямую, используя system:

system ("/bin/bash ./setenv.sh");

Однако, обратите внимание , что то, что вы пытаетесь сделать, если только setenv.sh не имеет каких-либо побочных эффектов, не действует, так как оболочка, которую вы начинаете читать в этой среде, умирает сразу после выполнения system линия. Чтобы установить среду для вашей Perl-программы, вы должны использовать переменную %ENV.

3 голосов
/ 14 марта 2012

Судя по названию скрипта, setenv.sh, похоже, что вы ожидаете, что определенные переменные окружения будут установлены после выполнения вашего скрипта Perl.

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

Является ли отсутствие измененных переменных среды вашим основанием полагать, что ваш сценарий оболочки не выполняется?

Для получения дополнительной информации см. Может ли сценарий оболочки устанавливать переменные среды вызывающей оболочки?

2 голосов
/ 14 марта 2012

. - это встроенная оболочка (также известная как source). Функция system не передает аргументы через оболочку , по крайней мере, в базовом случае. Это означает, что вы пытаетесь выполнить обычную команду с именем ., а такого нет.

Интересно, что Perl будет передавать аргументы system через оболочку, когда он замечает некоторые метасимволы оболочки, так что, например, system(". setenv.sh | cat") будет работать.

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