2016-07-17 4 views
1

のコードチャンクを理解することは、誰もが、次は何しようとしているものを私に説明できますか?このコードチャンクの目的は何ですか?perlの

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

ありがとうございます!

EDIT1:私はに上記のコードブロックを変更しようとしている

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

と私は、スクリプトはシェルスクリプトのように扱われているとevalが実行されますとperl5がに呼び出されるので、それが動作するはずだと思いますperlを使って同じスクリプトを実行してください。しかし、私は実際にこれを実行すると、私が得た:この場合、スクリプトが失敗した理由を

/bin/sh: -S: invalid option

は誰が説明することができます。私は何かを誤解していますか?私はずっとksh

感謝を使用しています!

EDIT2: EDIT1はまったく別の問題のように思えると私はhere

+3

このフレーズを検索するだけで、ヒット数が多くなります。[find2perl perl shebang + evalの正確な意味は何ですか?](http://stackoverflow.com/questions/ 6123971/find-2-per-find-per-shebang-eval)のようなものです。そして、これはあなたの質問に答えるはずです。 –

+0

@SteffenUllrichリンクをありがとう! – zack

+0

このコードは 'find2perl'から来ましたか? – Borodin

答えて

1

それを投稿これはperlの下、適切にいずれかを実行するスクリプトファイルを取得するための汚いトリックである、またはそれが直接提出された場合それは継続行は無視され、その後のshやbashで実行されるなら文は、

しかし理由は終わりif 0のperlの下に絶対に何もしません

シェル、シェルはを行いますそして、同じファイルをperl5で実行してください。

考えてみれば、改行は改行を余白と見なしますが、シェルはそれらを文終了記号と見なします。それはPerlは全く新しいプロセスに

を文の残りの部分はif 0を言うので、シェルはそれを実行する一方、(限り、それがコンパイルされる)evalを無視し、execことを意味します私はポイントを見ると言うことはできません、適切なシバン行は、あなたがコマンドラインから直接foo.plを実行することを許可するので、とにかくそこにあります。人々はハックのように感じます。なぜなら、彼らは賢く感じるからです。

+0

答えをありがとう。私はこのコードチャンクの背後にある直感を理解しています。基本的にシェルで '' perl foo''または '' foo''を直接実行できます。しかし、「終わりに0なら」と「継続行」のために「もっと詳しく説明できますか?私はperlには本当に新しいです。助けてくれてありがとう! – zack

+0

見つかったhttp://stackoverflow.com/questions/6123971/what-is-the-exact-meaning-of-the-find2perl-perl-shebang-evalとhttp://unix.stackexchange.com/questions/68484シェルスクリプトとは何かを意味していますが、それは私にとって最も理にかなっています。答えをありがとう。 – zack

+0

@ジェリー:考え方は、改行は空白だけと見なしますが、シェルはそれらを改行文字と見なします。これは、Perlが 'eval'を無視することを意味します。なぜなら、残りのステートメントは' if 0 'と言っているのに対し、シェルはそれを実行し、' exec'はまったく新しいプロセスにします。適切なシバン行はコマンド行から 'foo.pl'を直接実行できるので、私はその点を見ているとは言えませんが、そこにはあります。人々はハックを好きです。なぜなら、彼らは賢い気分になるからです。 – Borodin