Was ist der Unterschied zwischen dem Aufrufen eines Perl-Skripts über sh oder perl?

7

Ich habe ein einfaches Hello World Perl-Skript.

#!/usr/bin/perl

print 'Hello world.';

Es funktioniert gut, wenn ich es ausführe perl <file_name>, aber es schlägt fehl, ich führe es aus sh <file_name>.

Mein Verständnis der ersten Zeile ist, dass sie die Perl-Shell aufruft (ähnlich wie #! / Usr / bin / bash eine Bash-Shell aufruft). Was genau ist der Unterschied zwischen den beiden Befehlen?

Ich habe diesen Thread http://ubuntuforums.org/showthread.php?t=1133334 gefunden , der besagt: sh <file_name> "In diesem Fall führen Sie überhaupt kein Perl aus, sondern die Shell, die das Programm 'print' aufruft." WENN das der Fall ist, ist das #! nur als Kommentar interpretiert. Wenn ja, wird es überhaupt benötigt?

(Mir ist bewusst, dass ich die Datei chmod + x und direkt ausführen kann, aber ich möchte nur den Unterschied zwischen den beiden von mir verwendeten Methoden kennen.)

Dave
quelle

Antworten:

6

Wenn Sie eine Datei direkt ausführen

/path/to/script/filename

Die Shebang-Zeile wird nach dem Interpreter durchsucht, um sie auszuführen. Wenn Sie perloder shmit einem Argument ausführen , verhalten sie sich wie dokumentiert: Versuchen Sie, die Datei als Skript in Perl bzw. Shell zu interpretieren.

Wenn Sie den Interpreter explizit über die Befehlszeile festlegen (z. B. sh foo.ploder perl foo.pl), wird die Shebang-Zeile nicht verwendet, um den auszuführenden Interpreter zu bestimmen. Es wird nach möglichen Optionen analysiert (z. B. mit einem #!/usr/bin/perl -wShebang, bei dem das Skript ausgeführt perl foo.plwird, um das -wFlag zu aktivieren ), es wird jedoch nicht verwendet, um zu bestimmen, welches Programm das Skript interpretieren soll.

Wenn Sie also ein Perl-Skript ausführen, sh foo.plbedeutet dies, dass Ihr System versucht, es shstattdessen als Skript zu interpretieren , trotz der Perl-Shebang-Zeile.

Choroba
quelle
@terdon: Nicht ganz korrekt mit Ihrem Update. Perl wird die Shebang - Zeile in einem Skript für Schalter analysieren.
Dubu
@ Dubu auch wenn das Skript als gestartet wird sh foo.pl? Perl wird in diesem Fall nicht einmal angerufen . Wie wird es den Schebang analysieren? Der shebang ist nur lesen , wenn Sie nicht über einen Dolmetscher angeben ( shoder perloder was auch immer) , wenn das Skript zu starten. Das ist das Problem, mit dem das OP konfrontiert ist. Es wird zwar analysiert, wenn Sie mit dem richtigen Interpreter ( perl foo.pl) starten, aber nicht, wenn Sie den falschen ( sh foo.pl) verwenden.
Terdon
@terdon: Die Antwort besagt jetzt, dass die Shebang-Zeile ignoriert wird, wenn das Skript als Argument für perl oder aufgerufen wird sh. Ich wollte darauf hinweisen, dass dies nicht gilt, wenn es als aufgerufen wird perl <filename>.
Dubu
@ Dubu fair genug. Jetzt klarer?
Terdon
@terdon Fast perfekt. Ob die Shebang-Linie interpretiert wird, hängt natürlich vom Interpreten ab. perltut es, denn shich weiß es nicht.
Dubu
1

Sie haben das Skript also nicht ausführbar gemacht? sh geht nicht automatisch davon aus, dass Dinge mit diesen Dateierweiterungen ausführbar sind. Sie müssen sie also entweder ausführen perl <file name>oder mit ausführbar machenchmod +x

Chris Pickard
quelle
0

Je nachdem, wie Perl auf dem von Ihnen verwendeten System installiert ist, sind die beiden möglicherweise nicht identisch. Versuchen Sie, diesen Befehl einzugeben:

which perl

Es zeigt Ihnen den Pfad zu der ausführbaren Datei mit dem Namen "perl" in Ihrem $PATH(Typ echo $PATH, um Ihre zu sehen $PATH). Auf vielen Systemen wird dies der Fall sein /usr/bin/perl, auf dem Perl normalerweise installiert ist. Aus diesem Grund wird in der Zeile "shebang" am Anfang der meisten Perl-Skripte auch davon ausgegangen, dass Perl vorhanden ist.

Auf einigen Systemen kann der Pfad zu perljedoch unterschiedlich sein. In diesem Fall erhalten Sie möglicherweise ein anderes Ergebnis als bei perl your_script.plVerwendung der Shell zur Interpretation der Shebang-Linie, z ./your_script.pl. Im ersten Fall perlinterpretiert der Interpreter in Ihrem $PATHSkript Ihr Skript, im zweiten Fall den nach /usr/bin/perlBelieben. Diese sind möglicherweise nicht gleich.

In vielen Fällen perlhandelt es sich um eine eigene Installation von Perl, die wahrscheinlich neuer ist als die, die mit dem System (in /usr/bin) geliefert wurde . Mit anderen Worten, es gibt mehr als einen Perl-Interpreter im System. In diesem Fall sollten Sie besser herausfinden, welchen Sie möchten, und seinen Pfad in Ihrer Shebang-Zeile fest codieren, damit Ihr Skript nicht versehentlich mit der falschen Version von Perl interpretiert wird. (Sie können auch Dinge wie use 5.12;in Ihr Skript schreiben, um diesbezüglich zusätzliche Sicherheit zu gewährleisten.) Geben Sie Folgendes ein, um die Version des Perl-Interpreters zu überprüfen /path/to/perl -v.

njahnke
quelle