我该如何在MSYS中安装Strawberry Perl?

8
我已经安装了 Strawberry Perl 并删除了 msys Perl 5.6。
现在,由于环境变量 PATH 的设置,perl 命令将调用 Strawberry 版本。但是,如何映射在 .pl 或其他 Perl 脚本文件中的 perl 命令,这些文件有 #!/bin/perl#!/usr/bin/perl 的 shebang 行?
我考虑创建一个到 msys/bin 目录下的 perl.exe 的硬链接,或者将整个 Strawberry 安装在 msys 目录下,但我不确定哪种方法更好。

请注意,Strawberry Perl和MSYS Perl(/usr/bin/perl)可能不是100%兼容的,特别是在涉及到MSYS支持的类Unix操作系统方面,而Strawberry Perl则是本地Windows环境。 - Niklas Holm
3个回答

4
解决方法是从MSYS中创建一个到Strawberry Perl可执行文件的符号链接 感谢smaudet的贡献
首先,如果有的话(已经完成),删除或重命名MSYS安装程序附带的Perl可执行文件,例如:
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 的现有脚本将再次可用(后者也可行,因为在 MSYS 中,/bin/usr/bin 实际上是相同的位置)。
请注意,使用更灵活的 shebang 行 #!/usr/bin/env perl 编写的脚本不需要此操作,因为 env 将直接在路径中查找 Strawberry Perl 的 perl.exe

一些背景

类Unix环境,如MSYS和Cygwin不遵循Windows的%PATHEXT%变量来确定用哪个可执行文件调用(非二进制)文件。换句话说:文件名扩展名在这里与执行无关

相反,它们仅根据文件是否有shebang行

  • 如果有,则使用shebang行中指定的可执行文件。
  • 如果没有,则使用默认的(类POSIX)shell /bin/sh
    • 因此,直接尝试调用*.bat*.cmd文件会失败,因为它们没有Unix shebang行,因此由/bin/sh而不是cmd.exe执行。

与Windows不同的是,这也适用于没有任何文件名扩展名的(可执行)文件。


0

正确的shebang应该是,例如#!"C:/strawberry/perl/bin/perl.exe"。然而,您可能更喜欢显式地使用Perl运行脚本,而不是依赖于shebang,例如perl script.plperl "C:\strawberry\perl\bin\cpan"

请注意,Strawberry Perl对其自己的脚本(例如和)无法正确设置shebang。错误报告在https://rt.cpan.org/Public/Bug/Display.html?id=82837


0

这在计算机的Windows侧面上运行得非常好,在MSYS侧面上,您可能需要:

  • 检查PATH环境变量并修复以包括草莓perl访问路径

  • 检查shebang行(#!/usr/bin/perl)中的脚本完整路径。 在msys中绝对的那些路径实际上是相对于Windows中的msys安装目录的。 您可能需要“插入”草莓perl安装以匹配或更改#!行

在后一种情况下,我的建议是使用类似于:#!env perl的东西,它检查perl解释器的环境并减轻处理/cygdrive/c/my/windows/path/not/visible/from/msys/otherwise的负担。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接