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.)
quelle
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 (sh
oderperl
oder 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.perl
oder aufgerufen wirdsh
. Ich wollte darauf hinweisen, dass dies nicht gilt, wenn es als aufgerufen wirdperl <filename>
.perl
tut es, dennsh
ich weiß es nicht.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
quelle
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
(Typecho $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
perl
jedoch unterschiedlich sein. In diesem Fall erhalten Sie möglicherweise ein anderes Ergebnis als beiperl your_script.pl
Verwendung der Shell zur Interpretation der Shebang-Linie, z./your_script.pl
. Im ersten Fallperl
interpretiert der Interpreter in Ihrem$PATH
Skript Ihr Skript, im zweiten Fall den nach/usr/bin/perl
Belieben. Diese sind möglicherweise nicht gleich.In vielen Fällen
perl
handelt 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 wieuse 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
.quelle