2009-02-20 11 views
17

envを使用してperl -wを実行します。シバンラインでperlのスイッチを/ bin/envと一緒に使うことはできますか?

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

:それはコマンドラインに正常に動作します:

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

しかし、それはスクリプトでシェバングライン上では動作しません:エラーここで

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

です明らかにenvは、私がperlに渡している-wフラグを理解していません。どうしましたか?

+0

小さなシェルのハッカー[1](http://stackoverflow.com/a/9051635/128583)と[2](http://stackoverflow.com/a/3306658/128583)でそれを行う方法も参照してください。 )。 – Davorak

答えて

25

ハッシュバングは、通常のシェルコマンドラインではなく、解析とホワイトスペースの処理が異なります。これはあなたが当てたものです。参照:

基本的には、多くの/ほとんどのUnixは、単一の引数に最初のスペースの後に残りのテキストのすべてを置きます。

ので:あなたは、いくつかの他の方法でのperlインタプリタに任意のオプションを処理する必要が

/bin/env "perl -w" 

#!/bin/env perl -w 

が相当です。すなわち、(Telemachus @など)

use warnings; 

15

代わりの-w(Perlの現代のバージョンの)警告プラグマを使用します。

#!/bin/env perl 
use warnings; 
use strict; 
+0

ええ、私は "警告を使う"ことを知っていますが、私は "perl -w"と書くだけでよく、 "env"はコマンドラインでは動作しますが、スクリプトでは動作しないと思っています。 – Frank

+0

"perl -w"はUnix上で動作し、より簡潔ですが、Windows上では動作しません(ActivePerlやシバンラインのコマンドラインフラグを明示的に検索しない限り)。警告 "; –

-1

あなたは/usrディレクトリを忘れています。

+1

のenvは異なる場所に置くことができます。私のシステムでは/ bin/envに/ usr/bin/envへのソフトリンクがあります。それはコマンドラインから動作するので、私は彼がプログラムの正しいパスを持っていると思います。 – gpojd

+1

/usr/bin/envを使用する方が移植性が高くなります。 –

5

私は「-w」は、「使用上の警告」と同じではないことを持ち出すために役に立つかもしれないと思いました。 -wは、使用するすべてのパッケージに適用されます。「警告を使用する」は、字句的にのみ適用されます。

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

:あなたは通常、それはOS X上で、次のように動作しますので、Mac OS Xは、引数としてシェバング後の文字を解釈していることは注目に値します「-w」

2

時に使用したり、依存したくありませんしかし、#!/ usr/bin/envを使用するポイントの1つは、プラットフォーム間の互換性を促進することなので、おそらくMac上であってもその構文を使用しないことをお勧めします。

関連する問題