2012-09-08 4 views
6

私は、Perlに比較的新しいですし、他の誰かが書いたPerlファイルに取り組んでいます、と私は、スクリプトの先頭に次のステートメントに遭遇保つ:ロングevalの文字列

eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"[email protected]"}' && eval 'exec perl -w -S $0 $argv:q' 
    if 0; 

これら2つのラインは何をしていますか?コードチェックとは何ですか?と文は何をif 0;は何ですか?

答えて

8

これはexecハックの変形です。インタプリタが確実に#!で指定される前の日に、これを使ってシェルをexecのperlにしました。 2行目のif 0は、シェルによって読み取られることはありません。シェルは最初の行のみを読み取り、execs perlはif 0を読み取り、それ自体を再実行しません。

これは興味深い変形ですが、私は正しくはないと思います。これは、bourneシェルまたはcshバリアントで動作するように設定されています。初期evalを使用してそれを解析するシェルを決定し、適切な構文を使用して引数をperlに渡します。中間節はsh構文であり、最後の節はcshに適しています。 2番目の&&||で、最初のeval '(exit $?0)'が実際にcshで失敗した場合、これはそれらの目標を達成するでしょうが、書かれているように、私はcshのためにはうまくいかないと思います。これに先立って、シェルに基づいてある値に$?を設定するコマンドがありますか?しかし、そうであっても$?がゼロ以外の値に設定されていても、&&||に置き換えられない限り、実行されるものはありません。面白いことが起こっています。

+0

ありがとうございます! 'execハック'とは何ですか?あなたは 'シバン 'を意味しますか? –

+0

execハックは、基本的には、シバンラインを使用するのではなく、特定のインタプリタを呼び出すためにexecを使用する技術です。 –

+0

ありがとう!それに相当する 'shebang'行は何でしょうか?どういうわけか、この 'eval'チェックは特定のバイナリ/インタープリタを使うように求めるよりも複雑に見えます。 –

関連する問題