Die Lösung wird auf erstellen einen Symlink zum Strawberry Perl ausführbaren aus MSYSSpitze des Hutes zu smaudet für seine Eingabe:
Zuerst entfernen oder die Perl ausführbaren Dateien umbenennen, die MSYS-Installation kam mit, falls vorhanden (was das OP bereits getan hat); zB:
mv /usr/bin/perl /usr/bin/perl.msys
mv /usr/bin/cpan /usr/bin/cpan.msys
Dann einen Symlink zu Strawberry Perl ausführbaren an seinem Platz schaffen:
ln -s /c/strawberry/perl/bin/perl.exe /usr/bin/perl
# Unfortunately, doing the same for `cpan` doesn't work directly, because
# Strawberry Perl's `cpan` executable is a *batch* file, `cpan.bat`, which
# cannot be directly invoked from MSYS.
# To invoke it from MSYS (assuming it is in the %PATH%):
# cmd /c 'cpan.bat ...'
# With an explicit path:
# cmd /c 'c:\strawberry\perl\bin\cpan.bat ...'
#
# Here's how to create a stub script that still allows invocation as
# `cpan`:
echo 'cmd /c "C:\strawberry\perl\bin\cpan.bat $*"'>/usr/bin/cpan && chmod +x /usr/bin/cpan
Sobald die /usr/bin/perl
Symlink an seinem Platz ist, vorhandenen Skripts mit shebang Linien #!/usr/bin/perl
und #!/bin/perl
funktioniert wieder (letzteres funktioniert auch, weil /bin
und /usr/bin
effektiv die gleiche Stelle in MSYS sind).
Beachten Sie, dass mit der flexibleren shebang Linie geschriebene Skripte #!/usr/bin/env perl
tut nicht dies benötigt, weil env
wird direkt Strawberry Perl perl.exe
auf dem Weg zu finden.
Einige Hintergrund:
Unix-Emulationsumgebungen wie MSYS und Cygwin tun nicht Respekt %PATHEXT%
Variable Windows zu bestimmen, welche ausführbare Datei ein (nicht binär) aufzurufen Datei mit. Mit anderen Worten: Dateinamenerweiterungen haben keine Bedeutung bezüglich der Ausführung dort.
Stattdessen sie gehen allein davon ab, ob die Datei eine Shebang-Zeile hat:
- Wenn es eine ist, die ausführbare Datei in der Shebang-Zeile angegeben verwendet wird.
- Wenn keine vorhanden ist, wird die standardmäßige (POSIX-ähnliche) Shell
/bin/sh
verwendet.
- So versucht
*.bat
oder *.cmd
Dateien aufzurufen direkt ausfällt , weil sie und nicht über eine Unix shebang Linie haben, werden daher durch /bin/sh
statt cmd.exe
ausgeführt.
Anders als in Windows funktioniert dies auch mit (ausführbaren Dateien), die keine Dateinamenerweiterung überhaupt haben.