Подтвердить что ты не робот

Могу ли я использовать 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. Что не так?

4b9b3361

Ответ 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.