2014-12-16 4 views
0

У меня есть несколько скриптов Perl, где строка shebang устарела. То есть, shebang указывает на более старую версию Perl.Больше приоритета - строка Shebang или команда perl?

Старый на пути:

#!/data/oracle10.0/perl/bin/perl 

Новая версия Perl в

#!/data/**oracle11.0**/perl/bin/perl 

Я softlinked команды PERL к месту новой версии Perl.

perl -> /data/oracle11.0/perl/bin/perl 

Теперь shebang указывает на устаревшую версию и командные пункты perl на более новую версию.

Итак, когда я делаю perl sample.pl, shebang игнорируется.

Я написал несколько примеров скриптов, чтобы это увидеть. Кажется, строка shebang игнорируется, когда я использовал команду perl. Но я помню, что это было не так с более старой версией perl (Shebang считался над командой perl).

Итак, мой вопрос: изменилась ли новая версия perl (5.10) и более ранней версии (5.8) по отношению к линии shebang? Новая версия Perl игнорирует строку shebang, если команда perl передается ему?

+2

Запустите 'which perl' из строки cmd, чтобы проверить, что вы на самом деле используете. 'chmod 755 script.pl; ./script.pl', чтобы заставить perl от shebang. –

+1

Perl всегда сканировал строку shebang для дополнительных аргументов командной строки, но это не 'exec' другой Perl. Предполагаемый потребитель линии shebang - ваша оболочка. – tjd

ответ

4

При запуске perl myscript.pl это запустит двоичный файл perl и дает ему myscript.pl в качестве входа, который затем запускается. В этом случае вы будете всегда получите первый perl двоичный код из вашего $PATH, независимо от версии Perl. Как сказал mpapec в своем комментарии, вы можете определить, какой perl это с помощью команды which perl.

Когда вы запустите ./myscript.pl, ваша оболочка ищет строку shebang и, если она присутствует, она выполняет программу, указанную в shebang, и дает ей содержимое файла в качестве входного. (Если нет, сама оболочка пытается обработать содержимое файла.) В этом случае вы будете всегда получите perl по пути от shebang, опять же независимо от версии Perl.

Это базовое поведение * nix и не изменилось между версиями Perl (поскольку оно не управляется perl).

+0

Я считаю, что с './Myscript.pl' это ядро, которое смотрит на первые 16 бит (в процессе, выложенном оболочкой), и если он' #! 'Пытается запустить (' execl'?), Что , и если это не удастся, оболочка получит выстрел. – zdim

 Смежные вопросы

  • Нет связанных вопросов^_^