私は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;
文は何をしますか?
これは、execハックの変形です。インタプリタを確実に指定できるようになる前の数日間#!
、これはシェルexecperlを作成するために使用されていました。2行目のif 0
onは、最初の行のみを読み取るシェルによって読み取られることはなく、perlを実行します。シェルは、を読み取り、if 0
それ自体を再実行しません。
これは興味深い変種ですが、私は完全に正しくないと思います。これは、bourneシェルまたはcshバリアントのいずれかで動作するように設定されているようで、最初のevalを使用して解析しているシェルを判別し、適切な構文を使用して引数をperlに渡します。真ん中の節はsh構文であり、最後の節はcshに適しています。2番目&&
がそう||
で、最初eval '(exit $?0)'
が実際にcshで失敗した場合、これはそれらの目標を達成しますが、書かれているように、cshではうまく機能しないと思います。これに先行し$?
て、シェルに基づいて何らかの値に設定されるコマンドはありますか?$?
ただし、その場合でゼロ以外の値に設定されている場合でも、を次のように&&
置き換えない限り、何も実行されません。||
。何か面白いことが起こっています。