6

私はPerlに比較的慣れておらず、他の誰かによって書かれたPerlファイルに取り組んでおり、スクリプトの冒頭で次のステートメントに遭遇し続けています。

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

これらの2行は何をしますか?コードチェックとは何ですか?とif 0;文は何をしますか?

4

1 に答える 1

8

これは、execハックの変形です。インタプリタを確実に指定できるようになる前の数日間#!、これはシェルexecperlを作成するために使用されていました。2行目のif 0onは、最初の行のみを読み取るシェルによって読み取られることはなく、perlを実行します。シェルは、を読み取り、if 0それ自体を再実行しません。

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

于 2012-09-08T00:14:25.973 に答える