我有Strawberry Perl并删除了 msys Perl 5.6。
现在perl
将调用 Strawberry(由于PATH
env),但是如何将perl
命令映射到.pl
具有#!/bin/perl
或#!/usr/bin/perl
shebang 行的其他 Perl 脚本文件中?
我正在考虑在msys/bin中对perl.exe进行硬链接,或者将整个草莓合并到msys目录中,但我不确定。
我有Strawberry Perl并删除了 msys Perl 5.6。
现在perl
将调用 Strawberry(由于PATH
env),但是如何将perl
命令映射到.pl
具有#!/bin/perl
或#!/usr/bin/perl
shebang 行的其他 Perl 脚本文件中?
我正在考虑在msys/bin中对perl.exe进行硬链接,或者将整个草莓合并到msys目录中,但我不确定。
解决方案是从帽子的 MSYS Tip 中创建一个指向 Strawberry Perl 可执行文件的符号链接,以便 smaudet输入:
首先,删除或重命名 MSYS 安装附带的 Perl 可执行文件,如果有的话(OP 已经这样做了);例如:
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 中的相同位置)。
请注意,使用更灵活的 shebang 行编写的脚本#!/usr/bin/env perl
不需要这个,因为会直接在路径中env
找到Strawberry Perl 。perl.exe
一些背景:
MSYS 和 Cygwin 等 Unix 仿真环境不尊重 Windows 的%PATHEXT%
变量来确定调用(非二进制)文件的可执行文件。换句话说:文件扩展名对于那里的执行没有意义。
相反,他们只看文件是否有 shebang 行:
/bin/sh
。
*.bat
or*.cmd
文件失败,因为它们没有 Unix shebang 行,因此由/bin/sh
而不是执行cmd.exe
。与 Windows 不同,这也适用于根本没有文件扩展名的(可执行)文件。
正确的 shebang 将是,例如。#!"C:/strawberry/perl/bin/perl.exe"
. 但是,您可能更喜欢使用 Perl 显式运行脚本,而不是依赖 shebang,例如。perl script.pl
或者perl "C:\strawberry\perl\bin\cpan"
请注意,Strawberry Perl 无法为其自己的脚本(例如cpan
and )获得正确的 shebang perldoc
。在https://rt.cpan.org/Public/Bug/Display.html?id=82837报告的错误
这在计算机的 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 的负担