perl: принудительно использовать флаги командной строки?

#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 -...