perl
はシバンそのものを解釈し、振る舞いをexec*(2)
と似ています。私は、BSDの最初の空白だけのものではなく、すべての空白で分割するというLinuxの動作をエミュレートすると思いますが、それは気にしないでください。ただ、really_python.pl
Perlはシボンループをどのように回避しますか?
#!/usr/bin/env python
# the following line is correct Python but not correct Perl
from collections import namedtuple
print "hi"
プリントがハイperl really_python.pl
として呼び出された簡単なデモとして
。
また、次のプログラムは、perl program
または./program
として呼び出されるかどうかに関係なく、適切な処理を行います。
#!/usr/bin/perl
print "hi\n";
と
#!/usr/bin/env perl
print "hi\n";
プログラムが無限ループではない理由を私は理解していません。上記のいずれの場合でも、シバン線は、perl
インタプリタへの絶対パスかそれに解決されます。その後、次のようなことが起こります。perl
はファイルを解析し、シバンに気付き、シバンパス(この場合はそれ自体)に委任します。 perl
はシバンパスを自分自身のARGV[0]
と比較しますか? perl
はシバン文字列を見て、部分文字列として"perl"
が含まれているかどうかを確認しますか?
私が期待していた無限ループ動作をトリガするためにシンボリックリンクを使用しようとしました。
$ ln -s /usr/bin/perl /tmp/p
#!/tmp/p
print "hi\n";
しかし、どのように呼び出されたかにかかわらず、そのプログラムは "hi"と表示されます。
OS Xでは、perl
をスクリプトを使って無限のシバンループにトリックすることができました。 /tmp/pscript
#!/bin/sh
perl "[email protected]"
のperlスクリプトの内容
#!/tmp/pscript
print "hi\n";
、これは無限ループを行います(OS X上で、まだLinux上でそれをテストしていない)の
内容。
perl
は、合理的な状況でシバンを正しく処理するためにはっきりと問題になります。シンボリックリンクとは混同されておらず、通常のenv
のもので混乱しません。それは正確に何をしていますか?
注:これはOPが 'perl/tmp/pscript'を使ってスクリプトを起動したことを前提としています。 '/ tmp/pscript'を使ってスクリプトを起動すると、その答えは少し異なります。 – ikegami