Cygwin:Perl 脚本 $ENV{PATH} 调用返回 unix 路径.我该如何更改它



我正在调用来自cygwin的Perl脚本。我遇到的问题是,当它调用$ENV{PATH}时,接收的路径是Unix路径。如何更改我的外壳以使其返回 DOS 路径?

> Cygwin是Windows的Unix仿真环境。除非$PATH是Unix风格的路径,否则它不起作用。

如果你想perl给你一个DOS路径,请使用DOS兼容的Perl,比如Strawberry Perl。如果你愿意,你甚至可以从Cygwin运行Strawberry Perl(或者你使用的任何Windows perl版本)。

它与外壳无关,所以更换外壳无济于事,而且您可以在外壳中更改任何内容来提供帮助。

>echo %PATH% & perl -E"say $ENV{PATH}"
c:progscygwinbin;...;C:Windowssystem32;...
/usr/bin:...:/cygdrive/c/Windows/system32:...

cygwin的目的是允许Unix程序在Windows机器上编译,尽可能少的更改,这意味着系统调用的行为必须像程序在unix机器上执行一样,这意味着PATH必须看起来像Unix路径。

如果你使用的是 Perl 的 Windows 版本(例如 ActivePerl 或 Strawberry Perl),就不会有这个问题。

如果你想继续使用Perl的Cygwin版本,你可以使用Cygwin工具cygpath为你转换路径。

$ perl -E'
    my $cmd = q{IFS=: ; cygpath -w $PATH};
    chomp( my @paths = `$cmd` );
    say for @paths;
'
C:progscygwinhomeikegamiusrperlbrewbin
.
C:progscygwinhomeikegamibin
C:progscygwinusrlocalbin
C:progscygwinbin
C:progsperl5163-ap1603sitebin
C:progsperl5163-ap1603bin
C:bin
C:Windowssystem32
C:Windows
...

您可以使用cygpath并通过以下方式调用 bash: (看起来您必须设置 IFS。

` IFS=:; cygpath --windows $PATH`

或取消设置 IFS。

`IFS=;cygpath --windows --path $PATH`

或者你可以用一些简单的规则来做到这一点。

map { 
    # turn cygdrives to drive letter + colon
    s!^/cygdrive/(w)/!U$1:!;   
    # locate the cygwin relative paths to whatever it is on your system.
    s!^/!$CYGWIN_HOME/!;
    $_ = qq("$_") if m/[() ]/; # quote paths where necessary
    # You don't really need to switch the slashes for perl, Java
    # a lot of other multi-platform tools.
    s!/!\!g;
} split /:/, $ENV{PATH}
;

请注意,您可能需要展开匹配表达式中的字符集。

我希望这有所帮助,尽管可能有点晚了:)

将 PATH 复制到 Cygwin 无法识别的变量并改用它:

set MYPATH=%PATH%
perl -e 'print join("n",split(";",$ENV{MYPATH}),"n")'

相关内容

  • 没有找到相关文章

最新更新