выполнение сценариев perl / python / ... с использованием exec () - PullRequest
2 голосов
/ 21 сентября 2011

Я играл с функциями linux exec () в моей программе на C ++ и пытаюсь выполнить сценарии (perl, python, php, ...).

из bash, который я могу выполнитьнапример: sh -c "perl /home/ignition/test.pl"

, но

execl("/bin/sh", "sh", "-c", "\"perl /home/ignition/test.pl\"", NULL);

не работает.Это работает:

execl("/bin/sh", "sh", "-c", "/home/ignition/test.pl", NULL);

, но это зависит от правильного пути для интерпретатора perl, который указывается в качестве первой строки скрипта, что не очень универсально, например, это не работает с phpскрипты.Я хотел бы использовать метод sh -c, чтобы путь к интерпретатору определялся автоматически ...

Может кто-нибудь указать, что я делаю неправильно?

Ответы [ 2 ]

2 голосов
/ 21 сентября 2011

В первом примере вы пытались выполнить программу с именем "perl, указав в качестве первого аргумента файл /home/ignition/test.pl".Когда вы используете оболочку напрямую, она удаляет кавычки перед запуском программы.

Попробуйте: execl("/bin/sh", "sh", "-c", "perl /home/ignition/test.pl", NULL);

1 голос
/ 21 сентября 2011

Вам не нужно использовать кавычки вокруг аргументов, которые содержат пробелы, при использовании функций exec. Попробуйте:

execl("/bin/sh", "sh", "-c", "perl /home/ignition/test.pl", NULL);

Кроме того, вы можете изменить строку shebang в скрипте примерно так:

#!/usr/bin/perl -w

до

#!/usr/bin/env perl -w

Программа env знает, как искать в PATH, чтобы найти двоичный файл perl, и не использует жестко закодированное местоположение (вы можете быть почти уверены, что /usr/bin/env существует).

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