如何在MSYS中设置Strawberry Perl?

时间:2009-12-04 10:42:59

标签: perl msys strawberry-perl

我有Strawberry Perl并删除了msys Perl 5.6。

现在perl将调用Strawberry(由于PATH env),但如何在perl或其他具有{{1}的Perl脚本文件中映射.pl命令}或#!/bin/perl shebang线?

我正在考虑在 msys / bin 中建立 perl.exe 的硬链接,或者将整个草莓合并到 msys 目录中,但是我不确定。

3 个答案:

答案 0 :(得分:3)

解决方案是从MSYS中创建一个草莓Perl可执行文件的符号链接 帽子的提示到smaudet的输入

首先,删除或重命名MSYS安装附带的Perl可执行文件(如果有的话)(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和{{1实际上是MSYS中的相同位置。

请注意,使用更灵活的shebang行/usr/bin执行而非编写的脚本需要此功能,因为#!/usr/bin/env perl直接找到Strawberry Perl {{ 1}}在路径中。

一些背景

Unix-emulation环境(如MSYS和Cygwin)尊重Windows env变量以确定调用(非二进制)文件的可执行文件。换句话说:文件扩展名与执行无关。

相反,他们完全依赖文件是否有一个shebang行

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

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

答案 1 :(得分:0)

这在计算机的窗口侧可以很好地工作,在MSYS一侧可能需要

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

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

在后一种情况下我的建议是使用类似:#!env perl来检查perl解释器的环境并减轻处理/ cygdrive / c / my / windows / path / not / visible的负担/从/ MSYS /否则

答案 2 :(得分:0)

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

请注意,Strawberry Perl不会为自己的脚本提供权利,例如cpanperldoc。在https://rt.cpan.org/Public/Bug/Display.html?id=82837

报告错误