Что хорошего в том, что -CSDA указан только в строке Шебанга? - PullRequest
6 голосов
/ 18 марта 2011

Я ищу кого-то, кто мог бы авторитетно подтвердить или исправить то, что я знаю о опции -CSDA в строке shebang скрипта Perl.

См. perldoc perlrun для документации -CSDA. Кратко

  • S: STDIN, STDOUT и STDERR предполагаются в UTF-8
  • D: UTF-8 является слоем PerlIO по умолчанию для входного и выходного потоков
  • A: Элементы @ARGV должны быть строками, закодированными в UTF-8
  • Чтобы -CSDA имел какой-либо эффект, он должен быть указан в командной строке как perl -CSDA script.pl.

  • До 5.10 -CSDA на линии shebang молча завершался сбоем, потому что стандартные потоки уже были бы открыты и @ARGV уже были заполнены к тому времени, когда были обнаружены, если -CSDA не было уже указано в командная строка.

  • После 5.10, -CSDA, который появляется только на линии Шебанга, вызывает perl квакают из-за этой проблемы.

  • Скрипт с -CSDA, который раньше работал с perl s до 5.10, должен удалить -CSDA из строки shebang, потому что он никогда не вызывался с этими параметрами в командной строке (и параметры, если они указаны только в строке shebang, ничего не сделали).

Я бы хотел получить убедительные отзывы о том, какие из моих предположений выше ошибочны.

Ответы [ 2 ]

3 голосов
/ 18 марта 2011

Если ваш скрипт

#!/usr/bin/perl -CSDA

и вы запускаете его с помощью

./script foo

ОС запустит Perl следующим образом:

/usr/bin/perl -CSDA ./script foo

Изменениев поведении вступает в игру только в том случае, если скрипт запускается неправильно, например, с помощью

/usr/bin/perl ./script foo

Исправление заключается не в удалении -CSDA, исправление - в правильном вызове сценария.

3 голосов
/ 18 марта 2011

Не уверен, насколько я авторитетен, но я знаю, как это работает.

  • Ваше первое предположение почти точно.Чтобы параметры SDA имели какой-либо эффект, они должны присутствовать при запуске интерпретатора.Это может произойти из-за -CSDA в командной строке, или из-за переменной среды PERL_UNICODE, или, возможно, из-за какого-то другого метода, который мне неизвестен.
  • Ваше второе предположение верно, по крайней мере, для 5.8.8.Обратите внимание, что флаг D все еще имел бы свой обычный эффект для потоков, открываемых сценарием.
  • Ваше третье предположение верно.Однако, начиная с 5.10.1, он не будет каркать, если соответствующие флаги включены через переменную среды PERL_UNICODE или какой-либо другой механизм.
  • Ваше четвертое предположение не , как правило, правильно.Я полагаю, вы ссылаетесь на ситуацию, когда скрипт вызывается напрямую, а не на вызов интерпретатора perl со скриптом в качестве аргумента.Есть два общих случая.
    • В системе, где операционная система определяет, что любой файл с расширением ".pl" будет передан интерпретатору Perl для выполнения, например, Windows, вы можете быть правы.Но можно утверждать, что скрипение скрипта при вызове без -CSDA является желаемым поведением, а не таинственным сбоем, потому что стандартный ввод и @ARGV не соответствуют UTF-8, как ожидает скрипт.
    • В системекоторый читает строку shebang при непосредственном выполнении скрипта, как и большинство * nix-оболочек, параметры командной строки, указанные в строке shebang, будут использоваться при вызове интерпретатора, и поэтому -CSDA в строке shebang будет быть удостоенным чести.
...