2016-07-17 7 views
1

Kann mir jemand erklären, was das Folgende zu tun versucht? Was ist der Zweck hinter diesem Code-Chunk?Verstehen eines Code Brocken von Perl

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

Vielen Dank!

EDIT1: Ich versuche, den Codeblock oben in ändern: denken

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

und ich es sollte funktionieren, da das Skript wie Shell-Skript behandelt wird und eval erhalten ausgeführt und perl5 wird aufgerufen, um Verwenden Sie Perl, um das gleiche Skript auszuführen. Allerdings, wenn ich dies tatsächlich laufen, ich habe:

/bin/sh: -S: invalid option

Kann mir jemand erklären, warum dieser Fall das Skript fehlgeschlagen ist. Versteh ich etwas falsch? Ich benutze ksh

Vielen Dank!

EDIT2: EDIT1 scheint wie eine völlig andere Frage, und ich poste es here

+3

Einfach nach diesem Satz zu suchen, gibt viele Treffer, darunter [Was ist die genaue Bedeutung von find2perl perl shebang + eval?] (Http://stackoverflow.com/questions/ 6123971/Was-ist-die-genaue-Bedeutung-des-find2perl-perl-shebang-eval). Und das sollte deine Frage beantworten. –

+0

@SteffenUllrich Danke für den Link! – zack

+0

Ist dieser Code von 'find2perl' gekommen? – Borodin

Antwort

1

Dies ist ein schmutziger Trick ist eine Skriptdatei zu erhalten entweder richtig unter Perl, zu laufen, oder wenn sie direkt auf die vorgelegten Shell

die Aussage absolut nichts unter perl wegen der if 0 am Ende

wird jedoch tun, wenn es von sh oder bash ausgeführt ist dann die Folgezeile wird ignoriert, und die Shell die eval, und führen Sie die gleiche Datei über perl5

Die Idee ist, dass, während Perl Zeilenumbrüche als nur mehr Leerzeichen, die Shell sieht sie als Anweisung Terminatoren. Das bedeutet, dass Perl die eval (solange es kompiliert) ignorieren, weil der Rest der Aussage sagt if 0, während eine Schale es und exec zu einem ganz neuen Prozess

ausgeführt wird kann ich nicht sagen, dass ich den Punkt sehen, weil eine richtige Shebang-Zeile es Ihnen erlaubt, foo.pl trotzdem direkt von der Befehlszeile auszuführen, aber da sind wir. Leute mögen Hacks, weil es ihnen das Gefühl gibt, sich schlau zu fühlen

+0

Danke für die Antwort. Ich verstehe die Intuition hinter diesem Code-Chunk jetzt: Grundsätzlich kann ich entweder '' perl foo'' oder '' foo'' direkt in der Shell ausführen. Aber, könnten Sie näher auf "wegen" 'wenn 0 am Ende' '" und "der Fortsetzungslinie"? Ich bin wirklich neu in Perl. Vielen Dank für die Hilfe! – zack

+0

Ich fand http://stackoverflow.com/questions/6123971/what-is-the-exact-meaning-of-the-find2perl-perl-shebang-eval und http://unix.stackexchange.com/questions/68484 Was mir am nächsten kommt, macht mir am meisten Sinn. Danke für die Antwort. – zack

+0

@Jerry: Die Idee ist, dass, während Perl Zeilenumbrüche nur als mehr Leerzeichen betrachtet, die Shell sie als Anweisungsabschlusszeichen betrachtet. Das bedeutet, dass Perl das 'eval' ignoriert, weil der Rest der Anweisung' if0' sagt, während eine Shell es ausführt und 'exec' in einen ganz neuen Prozess. Ich kann nicht sagen, dass ich den Punkt sehe, weil eine richtige Shebang-Zeile es Ihnen erlaubt, 'foo.pl' direkt von der Kommandozeile aus zu starten, aber da sind wir. Leute mögen Hacks, weil sie sich schlau fühlen. – Borodin