Что означает «не работает под какой-либо оболочкой» в сценариях Perl? - PullRequest
5 голосов
/ 04 февраля 2012

Во многих скриптах Perl (особенно в известных дистрибутивах CPAN) я нахожу следующий фрагмент кода:

eval 'exec /usr/bin/perl -w -S $0 ${1+"$@"}'
if 0; # not running under some shell

Мне было интересно, для чего он нужен?

Спасибо.

Ответы [ 2 ]

8 голосов
/ 04 февраля 2012

Некоторые системы не распознают строку #!/usr/bin/perl в начале сценариев, и поэтому попытка вызвать программу Perl по имени в такой системе просто передаст сценарий оболочке.Чтобы бороться с этим, переносимые программы на Perl начинаются со строки, которая, когда интерпретируется стандартной оболочкой POSIX, заставляет скрипт вместо этого передавать perl(1).if 0 заставляет строку игнорироваться при запуске самим Perl, а размещение ее на отдельной строке заставляет оболочки обрабатывать ее как отдельную команду, запускающую только eval 'exec /usr/bin/perl -w -S $0 ${1+"$@"}', как только она прочитана.

2 голосов
/ 04 февраля 2012

Строка действительна как для оболочек, так и для Perl.В perl eval пропущен из-за следующего if 0.В оболочке тот же файл выполняется в perl с использованием eval.

...