2012-07-03 2 views
6

Я просматривал свои дистрибутивы CPAN и понял, что у меня были различные непоследовательные вещи в верхней части моих сценариев .t, основанных на том, откуда я их грузил. Это, конечно, оскорбляет меня.Какая должна быть первая строка скрипта Perl (.t)?

Итак, что такое «лучшая» первая строка скрипта Perl test (.t)? Ненаучного обследование моих источников .cpanm показал мне:

3429 use strict; 
3211 #!/usr/bin/perl 
1344 #!/usr/bin/env perl 
937 #!perl 
909 #!/usr/bin/perl -w 
801 #!perl -w 
596 
539 #!perl -T 

относящиеся к What should I use for a Perl script's shebang line?, но вот мне интересно, если притон необходимо/полезно вообще, если тесты всегда ожидается, будет вызвана из доказать ,

+1

Олег - не знаете, почему вы так оскорблены этим вопросом. Некоторые .t-файлы, похоже, имеют линии shebang разного типа, а некоторые вообще отсутствуют. Просто интересно, есть ли лучшая практика или если она имеет какое-то значение. –

+0

Я не обижаюсь. У меня есть две вещи, которые следует отметить по этому поводу: никаких отличий от любого другого сценария Perl - в ответе, и что shebangs - это kludge конкретной ОС (не очень удобно в ретроспективе). В нижней части моего ответа: не беспокойтесь о них - это бесполезно или, по крайней мере, просто относиться к ним как к любому другому сценарию. –

+1

Слишком плохо, что это было закрыто. Существуют фактические различия между общим сценарием perl и скриптами, работающими под доказом. В частности, если вы хотите запустить тест под tainting (обычно я этого не делаю, даже если это хорошая идея), вам нужно иметь «#! Perl -T», по крайней мере, так, что perl начнет с включенного tainting. Теоретически флаг -w должен быть полезен для включения глобальных предупреждений, но доказывает, что это уже добавляет (это ошибка, IMO). Другие флаги также могут быть полезны. Тем не менее, в отличие от обычных скриптов, * * первая строка отлично подходит для вас, если вам это не нужно. – Tanktalus

ответ

-2

.t Файлы по-прежнему являются обычным сценарием Perl. Используйте все, что вам нужно для этого сценария в первой строке.

+2

Это не только вопрос того, что мне нужно, если я хочу опубликовать в CPAN. Вопрос в том, что больше всего потребуется людям, и что наиболее переносимо, я думаю. –

+1

Они все еще не отличаются друг от друга **, я не понимаю, почему вам нужен отдельный вопрос. Кроме того, shebangs - всего лишь артефакт Unix. Просто не думай об этом вообще. Тот, кто хочет запускать тесты, будет использовать perl или доказать. –

2

use strict; должны быть в программе КАЖДЫЙ Perl (а также use warnings; и, вероятно, некоторые другие (в зависимости, кто вы говорите). Она не должна быть первой линии.

Остальная часть материала, который Вы присутствуют только несколько версий shebang. В системах на основе Unix и Unix для использования интерпретатора используется shebang. Если shebang не существует, будет использоваться текущая оболочка (то есть, если ваша оболочка поддерживает shebang1.).

Если вы находитесь в системе Windows, то shebang линия бесполезна. Windows использует суффикс файла, чтобы выяснить, как выполнить файл.

Вопрос в том, действительно ли вам нужна строка в строках, которые вы используете через испытательный жгут. Обычно я не выполняю эти тестовые сценарии отдельно, поэтому вообще не может быть необходимости в shebang. В редком случае вы хотите выполнить один из этих сценариев, вы всегда можете запустить их в качестве аргумента для самой команды perl. То же самое происходит с модулями Perl.

Итак, почему shebang? Главным образом привычка. Я тоже положил его на свои тестовые скрипты и на свои модули. Если ничего другого, это упрощает запуск модулей и тестовых скриптов независимо для целей тестирования. Кроме того, shebang позволяет людям знать, что это скрипт Perl, а не сценарий оболочки или скрипт Python.

Есть небольшая проблема с shebang, хотя, и это связано с переносимостью. Если я поставлю #! /usr/bin/perl на свою первую строку, а интерпретатор Perl находится в #! /usr/local/bin/perl, я получу ошибку. Таким образом, многие из shebangs отражают местоположение интерпретатора Perl для этого разработчика.

Есть еще одна проблема: я использую Perlbrew, что позволяет мне устанавливать несколько версий Perl. Версия Perl, которую я сейчас имею в моей оболочке, находится в /Users/David/perl5/perlbrew/perls/perl-5.18.0/bin/perl. Это нехорошо, если я передаю эту программу другому пользователю в другой системе. Или, если я решаю, что хочу протестировать свой скрипт Perl под 5.10.

Вариант #! perl является попытка решить эту проблему. В SunOS (я полагаю) это выполнит Perl, который находится в вашем $PATH (так как это может быть /usr/local/bin/perl или /usr/share/bin/perl или /usr/bin/perl в зависимости от системы). Однако это не работает в большинстве блоков Unix.Например, на моем Mac я получал бы плохую ошибку интерпретатора.

Я использую #! /usr/bin/env perl. Программа env принимает аргумент perl, видит, где perl находится на моем $PATH, а затем выполняет полный путь везде, где Perl находится на моем $ PATH. Это самый универсальный способ сделать shebang и способ, которым я рекомендую. Это позволяет использовать Perlbrew без проблем.

Примечание, я сказал почти универсал, а не универсал. Почти на всех системах, env находится в /usr/bin, но там, по-видимому, есть системы там, где env находится либо на /bin, либо находится в другом месте, либо нет в системе.

-w включает предупреждения при выполнении Perl. До Perl 5.6 вы использовали это для включения предупреждений. После Perl 5.6 вы можете использовать более гибкие use warnings;, а -w теперь считается устаревшим . Программы могут использовать его, потому что они были изначально написаны до 5.6 и никогда не изменялись, или разработчик просто делал это по привычке.

-T имеет отношение к taint mode. Режим Taint обычно используется для сценариев CGI. В принципе, в режиме Taint данные извне программы считаются tainted и не могут использоваться до untedted. Режим Taint также влияет на @INC и PERLLIB.

Настоящий ответ заключается в том, что ответа нет. Я бы поставил #! /usr/bin/env perl как свою первую строку из привычки - даже если я никогда не ожидаю выполнить этот файл из командной строки Unix. Там нет никакой реальной необходимости для этих типов скриптов, которые почти всегда выполняются как часть установки, а не непосредственно из командной строки. То, что вы видите, действительно является результатом 30-летних привычек Perl и рывков.


1. Вашей оболочка поддерживает хижину, если вы не используете 30-летнюю версию оболочки Bourne или очень старую версию оболочки C.

2. Я действительно не знаю, когда -w когда-либо официально устарел, но нет причин для его использования.

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