Решение состоит в том, чтобы создать символическую ссылку на исполняемый файл Strawberry Perl из MSYS Подсказка для smaudet для его ввода :
Сначала удалите или переименуйте исполняемые файлы Perl, с которыми шла установка MSYS, если таковые имеются (что OP уже сделал); e.g.:
mv /usr/bin/perl /usr/bin/perl.msys
mv /usr/bin/cpan /usr/bin/cpan.msys
Затем создайте символическую ссылку на исполняемый файл Strawberry Perl на его месте:
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
После установки символической ссылки /usr/bin/perl
существующие сценарии со строками shebang #!/usr/bin/perl
и #!/bin/perl
снова будут работать (последний также работает, поскольку /bin
и /usr/bin
фактически находятся в одном месте в MSYS). .
Обратите внимание, что скрипты, написанные с более гибкой линией Шебанга #!/usr/bin/env perl
делают не , это нужно, потому что env
будет напрямую найти Strawberry Perl perl.exe
в пути. 1029 *
Некоторые фон :
Среды эмуляции Unix, такие как MSYS и Cygwin, не не учитывают переменную Windows %PATHEXT%
, чтобы определить, с каким исполняемым файлом вызывать (недвоичный) файл. Другими словами: расширения имени файла не имеют никакого значения в отношении выполнения там.
Вместо этого они зависят только от того, есть ли в файле строка Шебанга :
- Если он есть, используется исполняемый файл, указанный в строке shebang.
- Если его нет, используется оболочка по умолчанию (POSIX-подобная)
/bin/sh
.
- Таким образом, попытка прямого вызова
*.bat
или *.cmd
файлов завершается неудачей , поскольку они не имеют строки Shebang Unix и поэтому выполняются /bin/sh
, а не cmd.exe
.
В отличие от Windows, это также работает с (исполняемыми) файлами, которые вообще не имеют расширения имени файла.