2016-07-17 12 views
0

これは別のpostからの質問です。そのポストからのコメントと回答に基づいて、私は別のものに次のシェバング+のevalを変更:shebang + evalの変更によりperlスクリプトのエラーが発生する

旧新バージョン

#!/bin/sh 
eval 'exec perl5 -S $0 ${1+"[email protected]"}' 
    if 0; 
機能しないバージョン

#!/bin/perl 
eval 'exec perl5 -S $0 ${1+"[email protected]"}' 
    if 0; 

の作品

#!/bin/perl#!/bin/shに変更していることに注意してください。私の理解に基づいて、スクリプトはt同じようなスクリプトを実行するためにシェルスクリプトのようにreqされ、evalが実行され、perl5が呼び出されます。しかし、実際にこれを実行すると、私は得ました:

/bin/sh: -S: invalid option 

このケースでは、スクリプトが失敗した理由を誰でも説明できますか。私は何かを誤解していますか?私は使用していますksh

またこのweb page私は私の新しいバージョンも同様に動作するはずです示唆しているようだ。

ありがとうございます!

+0

サンプル実行を示します。 '$ 1'や' $ @ 'のarg値はありますか?そして、あなたは '#!/ bin/ksh'を試しましたか?がんばろう。 – shellter

+2

この質問は、シェルとperlの不可解な部分と曖昧な部分を探究しています。 – Borodin

+1

@Borodin True(私は実際に '#!/ usr/bin/env perl'を好み、問題はなかったと思います。それにもかかわらず興味深い質問。私は '-S'スイッチを' perl5'のパラメータとして解釈するのはシェルのビジネスではないと考えました。だからなぜ_シェルは文句を言うのですか? – PerlDuck

答えて

9

Perlのドキュメントから:

#!ラインが単語「perlの」も単語「indir」が含まれていない場合は、#!にちなんで名付けられたプログラムがPerlインタプリタの代わりに実行されます。これはやや奇妙ですが、#!のマシンでは、SHELLが/usr/bin/perlであることをプログラムに伝えることができるので、Perlはそのプログラムを正しいインタープリターにディスパッチします。

だから、./scriptとして修正版を起動した場合:

  1. あなたのシェルは./script
  2. カーネルが実際に/bin/sh ./script
  3. sh実行し、それは見ているので、perl5 -S ./script
  4. perl5/bin/sh -S ./scriptを実行実行実行しますを含まないシバン。
  5. shは、-Sオプションを認識しないために死亡します。

そして、あなたがperl5 scriptとして修正版を起動した場合:

  1. あなたのシェルはそれがperlが含まれていないシェバングを見ているので、perl5 script
  2. perl5/bin/sh -S scriptを実行実行します。
  3. shは、-Sオプションを認識しないために死亡します。

また、私はオンラインで見つけるこのWebページには、私の新しいバージョンが同様に動作するはずことを示唆しているようです。

このページのコードは、使用したコードと大きく異なります。そのコードでは、実際のシバン行を無視して、ファイル内に後でperlを含むもの(コードからも抜けているもの)を探す明示的な指示(-x)があります。

関連する問題