Die Shebang-Linie ruft kein Perl auf

7

Ich bin ein neuer Ubuntu-Benutzer und versuche, unter Straberry Perl unter Windows 7 entwickelte Skripte auszuführen. Meine Ubuntu-Umgebung ist Ubuntu 14.04 LTS und Perl 5.18.2.

Die erste Zeile meiner Skripte lautet #!/usr/bin/perl, die den Perl-Interpreter in / usr / bin aufrufen soll, und tatsächlich lebt dort ein 10,2-KB-Objekt. Meine Skripte werden jedoch nur ausgeführt, wenn 'perl' das erste Befehlszeilenargument auf Terminal ist, wie in perl myscript.pl.

Gibt es eine Möglichkeit, Perl automatisch .pl-Skripte ausführen zu lassen, ohne es explizit aufzurufen?

mlibrt
quelle
8
Was ist der Fehler, wenn Sie ausführen./myscript.pl
Maythux
Hast du mehr als eine Version von Perl?
Maythux
3
Was ist die Ausgabe von which perl?
Helio
4
Was ist die Ausgabe von ls -l myscript.pl? Was sind insbesondere die Berechtigungen - gibt es eine xin der Liste (so etwas wie rwxr-x-rx)? Möglicherweise müssen Sie das ausführbare Bit aktivieren: Es chmod u+x myscript.plwird für den Eigentümer (dh vermutlich für Sie) ausführbar.
Stellen Sie Monica wieder her - notmaynard

Antworten:

10

Ich gehe davon aus, dass Ihre (in Windows entwickelten) Dateien im DOS-Format (CRLF) vorliegen.

Das wird den Schebang stören und mit nicht so klaren Botschaften scheitern:

$ ./my_script.pl
: No such file or directory

Informationen zum Überprüfen Ihrer Zeilenenden finden Sie unter /programming/3569997/view-line-endings-in-a-text-file .

Zum Beispiel:

bash-4.1$ cat -v my_script.pl
#!/usr/bin/env perl^M
^M
print "Hello World\n";^M
^M

Dann gibt es verschiedene Tools (z. B. dos2unix oder fromdos), mit denen Sie Ihre Textdateien in das richtige Unix-Zeilenende konvertieren können.

Nach der Konvertierung:

$ cat -v my_script.pl
#!/usr/bin/env perl

print "Hello World\n";

Und Sie können sie ausführen:

$ chmod 755 my_script.pl
$ ./my_script.pl
Hello World
jsantander
quelle
8

Um dies zu lösen, können Sie #!/usr/bin/env perlals Hash-Bang-Linie verwenden, anstatt #!/usr/bin/perldass Bash das erste Perl verwendet, das in Ihrem PATH gefunden wurde.

Zitiert von http://perlmaven.com/hashbang

Während wir #! / Usr / bin / perl als Hash-Bang-Zeile verwendet haben, kann es auch andere geben. Wenn wir beispielsweise eine andere Version von Perl an einem anderen Speicherort installiert haben und möchten, dass unsere Skripte dies verwenden, können wir den Pfad zu dieser Version von Perl festlegen. Zum Beispiel #! / Opt / perl-5.18.2 / bin / perl.

Das Setzen eines Hash-Bang (und Aktivieren des ausführbaren Bits) hat den Vorteil, dass der Benutzer nicht wissen muss, dass das Skript in Perl geschrieben ist. Wenn Sie mehrere Instanzen von Perl auf Ihrem System haben, kann die Hash-Bang-Zeile verwendet werden Wählen Sie die zu verwendende Perl aus. Dies ist für alle Personen auf der jeweiligen Maschine gleich. Der Nachteil ist, dass das in der Hash-Bang-Zeile aufgeführte Perl nur verwendet wird, wenn das Skript als ./hello.pl oder als hello.pl ausgeführt wird. Wenn es als perl hello.pl ausgeführt wird, wird die Version von perl verwendet, die zuerst in den in PATH aufgelisteten Verzeichnissen gefunden wird. Dies könnte eine andere Version von Perl sein als die in der Hash-Bang-Zeile.

Maythux
quelle
+1: Ihre Lösung war das, was ich sofort dachte, als ich die Frage las. ;-)
Helio
2

Eine andere Vermutung: Verfügt Ihr Skript über ausführbare Berechtigungen?

ls -lsollte Berechtigungen wie rwxrwxr-xauflisten, um die Datei als Skript auszuführen. Sie können die Berechtigungen in Ihrer GUI ändern (Rechtsklick → Eigenschaften und abhängig von Ihrem Dateimanagerprogramm normalerweise eine Registerkarte Berechtigungen mit einer Einstellung wie Ausführen: □ Ausführen der Datei als Programm zulassen ) oder über eine Text-Shell mit chmod; Beispiel: chmod u=rwx,g=rwx,o=rx my_script.pl"Der Benutzer, dem die Datei gehört, kann sie lesen, schreiben und ausführen. Mitglieder der Gruppe, die sie besitzt, können dasselbe tun. Andere können sie lesen oder ausführen (aber nicht schreiben)."

BRPocock
quelle
0

Vielen Dank an alle, ich habe eine funktionierende Lösung gefunden.

Ich benutze nur eine Version von Perl. Ich verwende eine Standard-Perl-Installation für eine Standard-Ubuntu 14.04 LTS-Installation mit den Standardtools bash und gedit.

Mit der bloßen 'myscript.pl' in der cmd-Zeile bekam ich seltsame Meldungen 'Keine solche Datei', 'Befehl nicht gefunden' oder 'Binärdatei kann nicht ausgeführt werden ...'.

Mit chmod u = x habe ich das x-Bit geändert. Das Skript wird immer noch nicht ausgeführt.

Dann habe ich mit gedit die UTF-8-Datei mit Unix LF anstelle von DOS CR / LF gespeichert. Würde immer noch nicht rennen.

Dann mit './myscript.pl' Bingo! es läuft schließlich mit! # / usr / bin / perl.

Fazit: Linux-Benutzer aus Windows müssen etwas Unix lernen ...

Mein Skript läuft jetzt sowohl unter Linux als auch unter Windows und druckt und sortiert Dateinamen und Nachrichten mit Akzentzeichen, sofern es im richtigen Standardformat gespeichert ist: UTF-8 mit Unix LF für Linux oder ISO-8849-1 oder ANSI mit CR / LF für Windows .

Wenn jemand mehr Informationen haben möchte, kann ich eine Barebone-Testversion veröffentlichen, die genau das tut.

mlibrt
quelle
1
Diese Antwort schlug genau vor, was Sie getan haben, danke, dass Sie Ihre Lösung zurückgeschickt haben, aber vielleicht sollten Sie diese Antwort stattdessen akzeptieren?
Kos
Ich habe versucht, alle oben genannten Kommentare zu berücksichtigen, um meine eigene Lösung zu finden. Ich möchte "meine" Lösung an alle senden, die sich die Zeit genommen haben, meine Frage zu beantworten. Ich bin mir nicht sicher, ob ich das richtig gemacht habe. Wenn heute Morgen jemand einen E-Mail-Link zu diesem Thread erhält, bestätigen Sie dies bitte.
mlibrt
Dies ist normalerweise gut, aber in diesem Fall schlug die Antwort, die ich verlinkt habe, vor, in der Praxis genau das zu tun, was Sie getan haben, damit es funktioniert, dh Wagenrücklauf + Zeilenvorschub (e) in Zeilenumbrüche umzuwandeln und das Skript als ausführbar zu markieren ;; Ihre Antwort enthält eine andere Methode, um dasselbe zu erreichen. Daher sollte sie beibehalten werden. Nochmals vielen Dank, dass Sie sie zurückgeschickt haben. Vielleicht wäre es fair, diese Antwort zu akzeptieren, zumindest um dem Benutzer für seine Bemühungen zu danken, da der Inhalt im Grunde der gleiche ist und diese Antwort vor 3 Tagen veröffentlicht wurde.
Kos