Perl-Skript wurde nicht gefunden, wenn es aus einem anderen Verzeichnis als dem aktuellen ausgeführt wurde

Perl-Skript wurde nicht gefunden, wenn es aus einem anderen Verzeichnis als dem aktuellen ausgeführt wurde

Ich verwende Perl64 unter Windows 10 mit installiertem UWIN.

Ich habe ein Perl-Skript namens sv2jb.pl geschrieben, das einwandfrei läuft, wenn es durch Eingabe seines Namens unter ksh aufgerufen wird und sich im aktuellen Verzeichnis befindet.

Ich habe dann ein Unterverzeichnis meines Home-Verzeichnisses mit dem Namen „scripts“ erstellt, das Skript dorthin verschoben und seinen vollständigen Pfad zur $PATH-Umgebung von ksh hinzugefügt. Wenn ich jetzt sv2jb.pl von einem anderen Verzeichnis als dem, in dem sich dieses Skript befindet, aufrufe (indem ich einfach den Namen des Skripts eingebe), erhalte ich folgende Meldung:

$ sv2jb.pl
Can't open perl script "//C/users/me/desktop/scripts/sv2jb.pl" : No such file or directory

Aber genau hier befindet sich die Datei ...

Wenn ich es so aus dem Home-Verzeichnis aufrufe (in dem sich das Skriptverzeichnis befindet):

$ scripts/sv2jb.pl

es funktioniert gut...

Wenn ich außerdem in dieses Verzeichnis wechsle und sv2jb.pl aufrufe:

$ cd scripts
$ sv2jb.pl

es läuft einwandfrei.

Ich verstehe nicht, was falsch ist:

  1. Das Skript selbst ist in Ordnung, da es ausgeführt wird, wenn es aus seinem Verzeichnis aufgerufen wird. Zu Ihrer Information, die erste Zeile lautet: #!//c/perl64/bin/perl.exe
  2. Die Variable $PATH ist in Ordnung, da die Fehlermeldung zeigt, dass ksh die Datei gefunden hat (obwohl es angibt, dass sie nicht gefunden werden kann).

Antwort1

Ich kenne mich mit UWIN nicht aus, aber ich nehme an, dass es Cygwin insofern ähnelt, als dass es eine Bibliotheksschicht bereitstellt, die über Windows ausgeführt wird.

Wenn Sie das Skript aufrufen, wird es im PATH gefunden, vom Programmlader geöffnet und nach der Zeile „#!“ durchsucht. Anschließend wird die ausführbare Binärdatei gefunden und mit dem Skriptnamen als erstem Argument ausgeführt.

Das Problem besteht darin, dass es sich bei der Binärdatei nicht um ActiveState Perl handelt, eine Windows-Anwendung.

Ich vermute, dass Perl ausgeführt wird, wenn sich das Skript im aktuellen Verzeichnis befindet und der Skriptname als relatives Programm übergeben wird (etwa perl sv2jb.jpl). Wenn es sich jedoch woanders befindet, wird ein vollständiger Pfadname angegeben (etwa perl //C/users/me/desktop/scripts/sv2jb.pl).

Aber die Windows-Binärdatei versteht den Pfad nicht, der ihr übergeben wird. Sie können dies feststellen, indem Sie sie direkt von einer Windows-Eingabeaufforderung aus aufrufen. Sie sollten Folgendes sehen:

C:\Perl64\bin>perl //C/users/me/desktop/scripts/sv2jb.pl  # what is running
Can't open perl script "//C/users/me/desktop/scripts/sv2jb.pl

C:\Perl64\bin>perl C:/users/me/desktop/scripts/sv2jb.pl   # Changed to windows-style filepath
[...program runs....]

Ich kann dasselbe Verhalten mit Cygwin/Win10 und ActiveState Perl reproduzieren.

Grundsätzlich gibt es seltsame Probleme, wenn man eine Windows-Binärdatei als ausführbare Datei für ein Unix-Skript einrichtet. Bei Cygwin würde ich vorschlagen, dass Sie stattdessen das Paket Perl anstelle des Windows-Pakets verwenden. Ich weiß nicht, ob das eine mögliche Lösung für UWIN ist.

Andernfalls können Sie Windows-Perl aufrufen, müssen dem Skript aber explizit einen Pfad im Windows-Stil übergeben.

verwandte Informationen