2017-10-16 124 views
0

我試圖獲取作爲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。

回答

0

您沒有絕對路徑。 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