我从cygwin调用一个Perl脚本。我遇到的问题是,当它调用$ ENV {PATH}时,路径接收是一个unix路径。如何更改shell以使其返回DOS路径?
答案 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")'