2017-10-16 7 views
0

私はCygwinのWindowsパスとして提供されているファイルへの絶対パスを取得しようとしています。それぞれMsys(Git Bash)perlです。私は、提供されたパスが "ネイティブ" Cygwin/MSysパスである場合にも機能するソリューションをご希望です。msysのcygwinでCwd :: abs_pathが壊れた

私は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の使用を避けたいと思います.Windowsのパスのみを理解しているActivePerlでもスクリプトを動作させたいからです。私はもちろん、unix-perlのcygpathだけを呼び出すためにいくつかのifを追加することができます。

答えて

0

絶対パスはありません。 msysとcygwinはUNIXエミュレーション環境であり、UNIXでは絶対パスは/で始まります。 F:\は、UNIXの有効な相対パスとファイル名です。 cygwinので

Linux$ touch 'F:\' 

Linux$ ls 
F:\ 

/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'は、ウィンドウパスであっても完璧に動作します。私はMSys perlのライブラリも少し助けてくれることを願っていました。 Cwd :: abs_pathはファイルシステムにも触れるので、それが返すものは有効なパスではなく、無効なパスの代わりにエラーを生成します。通常は存在しないパスではそうです。 – adrianN

関連する問題