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

时间:2014-02-20 19:22:15

标签: perl bash path cygwin

我从cygwin调用一个Perl脚本。我遇到的问题是,当它调用$ ENV {PATH}时,路径接收是一个unix路径。如何更改shell以使其返回DOS路径?

4 个答案:

答案 0 :(得分:3)

Cygwin是Windows的Unix仿真环境。除非$PATH是Unix风格的路径,否则它将无效。

如果您希望perl为您提供DOS路径,请使用与DOS兼容的Perl,例如Strawberry Perl。如果你愿意,你甚至可以从Cygwin运行Strawberry Perl(或者你使用的perl的任何Windows版本)。

答案 1 :(得分:0)

您可以使用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}
;

请注意,您可能必须在匹配表达式中展开字符集。

答案 2 :(得分:0)

它与shell无关,因此更改shell无济于事,并且您无需在shell中更改任何内容即可提供帮助。

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

cygwin的目的是允许在尽可能少的更改的Windows机器上编译unix程序,这意味着系统调用必须表现得好像程序在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:\progs\cygwin\home\ikegami\usr\perlbrew\bin
.
C:\progs\cygwin\home\ikegami\bin
C:\progs\cygwin\usr\local\bin
C:\progs\cygwin\bin
C:\progs\perl5163-ap1603\site\bin
C:\progs\perl5163-ap1603\bin
C:\bin
C:\Windows\system32
C:\Windows
...

答案 3 :(得分:0)

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

将PATH复制到Cygwin无法识别的变量,并使用该变量:

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