Cwd :: abs_path破坏msys,cygwin

Cwd :: abs_path破坏msys,cygwin

问题描述:

我试图获取作为Cygwin中的Windows路径提供的文件的绝对路径,分别是Msys(Git Bash)perl。我希望当提供的路径是“本机”Cygwin/MSys路径时也可以使用这些解决方案。Cwd :: abs_path破坏msys,cygwin

我试过使用Cwd :: abs_path,但似乎微妙地破碎了。下面是测试:

[email protected] MINGW64 /f/Temp 
$ perl 
use Cwd; 
print Cwd::abs_path("F:\\") . "\n"; 
print Cwd::abs_path("F:\\test.txt") . "\n"; 
print Cwd::abs_path("..\\test.txt") . "\n"; 
/f 
/f/Temp/F:/test.txt 
/f/Temp/../test.txt 

目录的工作,相对路径的“工作”,但不给我期望的结果(即..不消除),但是当我添加一个文件名的绝对路径结果是错误的。我曾希望Cwd能为我做路径翻译。

我需要稍后提取部分路径(使用File :: Spec中的函数),并且还需要打开该文件。要继续使用提取的部分,路径应该是所使用的perl版本的本地路径。我想避免使用cygpath,因为我希望脚本也可以使用ActivePerl,它只理解Windows路径。我当然可以添加一些ifs来为unix-y perls调用cygpath。

您没有绝对路径。 msys和cygwin是unix仿真环境,在unix中,绝对路径以/开头。 F:\是unix中的有效相对路径和文件名。

Linux$ touch 'F:\' 

Linux$ ls 
F:\ 

Cygwin中,/cygdrive/f/指你F:。您可以使用命令行实用程序cygpath在本机路径和Windows路径之间进行转换。

cygwin$ cygpath -w /cygdrive/c/ 
C:\ 

cygwin$ cygpath -u 'C:\' 
/cygdrive/c/ 

msys还应该有一种方式通过其虚拟unix文件系统访问Windows驱动器。

+0

MSys确实有一些规定使得使用Windows路径更容易。例如'perl F:\\ Temp \\ test.pl'工作得很好,即使它是一个Windows路径。我希望MSys perl的图书馆也会有所帮助。 Cwd :: abs_path也会触及文件系统,因此它可能会发现它返回的内容不是有效路径,而是产生错误而不是无效路径,正如通常用于不存在的路径一样。 – adrianN