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