Могу ли я использовать perl-переключатели с /bin/env в строке shebang?
Я хочу запустить perl -w
с помощью env
. Это отлично работает в командной строке:
$ /bin/env perl -we 'print "Hello, world!\n"'
Hello, world!
Но он не работает на линии shebang в script:
#!/bin/env perl -w
print "Hello, world!\n";
Вот ошибка:
/bin/env: perl -w: No such file or directory
По-видимому env
не понимает флаг -w
, который я передаю perl
. Что не так?
Ответы
Ответ 1
Хеш-бэнг не является нормальной командной строкой командной строки, обработка синтаксического анализа и обработки белого пространства отличается от того, что вы нажмете. См:
В основном много/большинство unixes помещают весь оставшийся текст после первого пространства в один аргумент.
Итак:
#!/bin/env perl -w
является эквивалентом:
/bin/env "perl -w"
поэтому вам нужно каким-либо образом обрабатывать любые параметры интерпретатора perl. т.е.
use warnings;
(как @Telemachus)
Ответ 2
Вместо -w
используйте прагму предупреждений (для современных версий Perl):
#!/bin/env perl
use warnings;
use strict;
Ответ 3
Я подумал, что было бы полезно понять, что "-w" - это не то же самое, что "использовать предупреждения". -w будет применяться ко всем используемым вами пакетам, "использовать предупреждения" будет применяться только лексически. Обычно вы не хотите использовать или полагаться на "-w"
Ответ 4
Стоит отметить, что Mac OS X интерпретирует символы после shebang в качестве аргументов, поэтому в OS X будет работать следующее:
#!/usr/bin/env perl -wT
enter code here
Однако, поскольку одна из точек использования #!/usr/bin/env заключается в содействии межплатформенной совместимости, лучше всего не использовать этот синтаксис, даже если вы находитесь на Mac в основном.
Ответ 5
Вы забыли каталог /usr
.