#perl
#perl
Вопрос:
Я часто пишу однострочники в командной строке вот так:
perl -Magic -wlnaF't' -i.orig -e 'abracadabra($_) for (@F)'
Чтобы создать сценарий для этого, я мог бы передать те же флаги в строку shebang:
#!/usr/bin/perl -Magic -wlnaF't' -i.orig
abracadabra($_) for (@F);
Однако с этим связаны две проблемы. Во-первых, если кто-то вызывает скрипт, передавая его в perl напрямую (как ‘perl script.pl ‘, в отличие от ‘./script.pl ‘), флаги игнорируются. Кроме того, я не могу использовать для этого «/ usr/bin / env perl», потому что, по-видимому, я не могу передавать аргументы perl при вызове его с помощью env, поэтому я не могу использовать другую установку perl.
Можно ли как-нибудь сообщить сценарию «Эй, всегда запускайся так, как если бы ты был вызван с помощью -wlnaF’ t’ -i.orig»?
Комментарии:
1. Perl повторно сканирует строку #! независимо от того, как она была вызвана.
2. Да, но тогда это мало что даст, как только вы
chmod x
это сделаете.
Ответ №1:
Вы не правы в отношении perl script.pl
версии; Perl специально ищет и анализирует параметры из #!
строки, даже в не-Unix, и при запуске как скрипт, а не напрямую.
#!
Строка всегда проверяется на наличие переключателей при разборе строки. Таким образом, если вы находитесь на компьютере, который допускает только один аргумент в#!
строке или, что еще хуже, даже не распознает#!
строку, вы все равно можете получить согласованное поведение переключения независимо от того, как был вызван Perl, даже если-x
он использовался для поиска начала программы.
(…)
Синтаксический анализ
#!
переключателей начинается везде, гдеperl
упоминается в строке. Последовательности «-*» и «- » специально игнорируются, чтобы вы могли, если бы захотели, сказать#!/bin/sh #! -*-perl-*- eval 'exec perl -x -wS $0 ${1 "$@"}' if 0;
чтобы Perl мог видеть переключатель -p.
Теперь приведенная выше цитата ожидает perl -x
, но она работает так же хорошо, если вы запускаете скрипт с
#! /usr/bin/env perl -*-perl -p-*-
(с достаточным количеством символов, чтобы преодолеть ограничение в 32 символа в системах с таким ограничением; подробнее об этом и остальном, что я процитировал выше, см. perldoc perlrun
).
Ответ №2:
У меня была такая же проблема с #!env perl -...
, и env
в итоге это помогло:
$ env 'perl -w'
env: ‘perl -w’: No such file or directory
env: use -[v]S to pass options in shebang lines
Итак, просто измените shebang на #!/usr/bin/env -S perl -...