Могу ли я использовать ключи Perl с / bin / env в строке shebang? - PullRequest
17 голосов
/ 20 февраля 2009

Я хочу запустить perl -w, используя env. Это прекрасно работает в командной строке :

$ /bin/env perl -we 'print "Hello, world!\n"'
Hello, world!

Но это не работает в строке shebang в скрипте:

#!/bin/env perl -w
print "Hello, world!\n";

Вот ошибка:

/bin/env: perl -w: No such file or directory

Очевидно, env не понимает флаг -w, который я передаю perl. В чем дело?

Ответы [ 5 ]

25 голосов
/ 20 февраля 2009

hash-bang - это не обычная командная строка оболочки, разбор и обработка пробелов отличаются - это то, что вы нажали. См:

Обычно многие / большинство юниксов помещают весь оставшийся текст после первого пробела в один аргумент.

Итак:

#!/bin/env perl -w

является эквивалентом:

/bin/env "perl -w"

так что вам нужно обрабатывать любые опции для интерпретатора perl каким-либо другим способом. т.е.

use warnings;

(как @ Телемах )

15 голосов
/ 20 февраля 2009

Вместо -w используйте прагму предупреждений (для современных версий Perl):

#!/bin/env perl
use warnings;
use strict;
5 голосов
/ 27 февраля 2009

Я подумал, что было бы полезно вспомнить, что "-w" не то же самое, что "использовать предупреждения". -w будет применяться ко всем пакетам, которые вы используете, «предупреждения об использовании» будут применяться только лексически. Обычно вы не хотите использовать или полагаться на «-w»

2 голосов
/ 28 сентября 2011

Стоит отметить, что Mac OS X интерпретирует символы после shebang как аргументы, поэтому в OS X будет работать следующее:

#!/usr/bin/env perl -wT
enter code here

Однако, поскольку одной из точек использования #! / Usr / bin / env является обеспечение кроссплатформенной совместимости, вероятно, лучше не использовать этот синтаксис, даже если вы в основном работаете на Mac.

0 голосов
/ 20 февраля 2009

Вы забыли каталог /usr.

...