我正在调用来自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")'