web-dev-qa-db-ja.com

msysパス変換(またはmsysのcygpath?)

/DEF:c:\filepath\myLib.def "コマンドラインオプションをbashスクリプトからMSコンパイラ/リンカーに渡す必要があります。パスは、bashスクリプトによってビルドプロセスの一部として生成されます。基本的に、スクリプトの引数パスは:

-DEF:/c/filepath/myLib.def

MSYSパス変換 が理解できないため、適切に処理できません/DEF:部分。私がやればうまくいく

-DEF=/c/filepath/myLib.def

しかし、msツールはこのパラメーターを理解しません。要するに、MSYS bashでそのパラメーターを書き込んで適切な引数に変換するための適切な方法は何ですか?

Cygwinではcygpathを使用できますが、msysの誰かが(cygpathを使用するcygwinのスクリプトがあっても)必要ないと考えているため、同等のものはありません。

35
Pavel P

更新(2016年8月):

msys2cygpathとともにインストールされるようになったため、この質問は関係ありません。

...

ここに私の研究を要約します。

の cygpath MSYSでこれに相当するのは、次のコマンドを使用することです。

{ cd /c/some/path && pwd -W; } | sed 's|/|\\|g'

このアプローチの問題は、既存のパスが必要なことです。 c:\some\pathは既存のディレクトリでなければなりません。しかし、本当の cygpath 存在しないパスをサポートします。

したがって、存在しないディレクトリへのパスを取得する必要がある場合は、パスのsed変換にフォールバックできます。

{ cd 2>/dev/null /c/some/path && pwd -W ||
  echo /c/some/path | sed 's|^/\([a-z,A-Z]\)/|\1:/|'; } | sed 's|/|\\|g'

一口のスラッシュはsedの引用規則を満たすためにあります。したがって、c:\some\pathがPCに存在しない場合は、フォワードスラッシュからバックスラッシュに変換し、/c/c:\(またはその他のドライブ文字)に置き換えようとします。これの唯一の欠点は、/bin/does-not-exist/usr/bin/does-not-existなどのマウントされたコンポーネントを含む存在しないパスが正しく機能しないことです。

もう1つのアプローチは、 cygpath MSYSのcygwinから。 cygwinがグローバル環境変数CYGPATHを設定するようです。つまり、通常のcmd.exeから使用できます。

%CYGPATH% -w /c/some/path
C:\some\path

またはMSYSから:

$CYGPATH -w /c/some/path
C:\some\path

cygwinで/c/cygdrive/cにポイントするように設定している限り。ただし、この方法では、MSYSではなくcygwinインストールにある/usrが出力されます。

要するに、msysは、msysコマンドライン引数変換ロジックによって自動的に処理されない場合のために、デフォルトのツールセットに実際のcygpathを実際に含める必要があると思います

49
Pavel P

使用する pwd -W

またはmsysのcygpathをここからダウンロード http://mingw.5.n7.nabble.com/enhanced-version-of-cygpath-td28556.html

cygpath -wa

12
Alex V.

上記のdmitri-rubinstein @と同様に、コードを少し整理し、逆の変換も追加しました。

winpath() {
    if [ ${#} -eq 0 ]; then
        : skip
    Elif [ -f "$1" ]; then
        local dirname=$(dirname "$1")
        local basename=$(basename "$1")
        echo "$(cd "$dirname" && pwd -W)/$basename" \
        | sed \
          -e 's|/|\\|g';
    Elif [ -d "$1" ]; then
        echo "$(cd "$1" && pwd -W)" \
        | sed \
          -e 's|/|\\|g';
    else
        echo "$1" \
        | sed \
          -e 's|^/\(.\)/|\1:\\|g' \
          -e 's|/|\\|g'
    fi
}

unixpath() {
    echo "$1" \
    | sed -r \
      -e 's/\\/\//g' \
      -e 's/^([^:]+):/\/\1/'
}
8
TJR

私はmsysgitでこれを使用しています:

winpath() {
    if [ -z "$1" ]; then
        echo "$@"
    else
        if [ -f "$1" ]; then
            local dir=$(dirname "$1")
            local fn=$(basename "$1")
            echo "$(cd "$dir"; echo "$(pwd -W)/$fn")" | sed 's|/|\\|g';
        else
            if [ -d "$1" ]; then
                echo "$(cd "$1"; pwd -W)" | sed 's|/|\\|g';
            else
                echo "$1" | sed 's|^/\(.\)/|\1:\\|g; s|/|\\|g';
            fi
        fi
    fi
}
6

私のbash fooは弱く、bash 3.1で正規表現を機能させることができなかったため、Perlスクリプトをハッキングしました。

#!/bin/env Perl
use strict;

my @r;
foreach my $e (@ARGV) {
 $e=~s/\//\\/g;
 $e=~s/^\\([A-Za-z])\\/\1:\\/;
 Push @r, $e;
}

print join(" ", @r);
3
tanglebones

MSYS cygpath

プログラム

このプログラムは、DOSパスをUNIXパスに、またはその逆に変換します

#!/bin/env Perl
# DOS to UNIX path conversion
# © John S. Peterson. License GNU GPL 3.
use strict;
use Getopt::Std;

# usage
if ($#ARGV == -1) {
    print 'Usage: cygpath (-w) NAME...

Convert Unix and Windows format paths

Output type options:

  -w, --windows         print Windows form of NAMEs (C:\WINNT)
';
    exit 0;
}

# option
my %opt;
getopts('w', \%opt);

# convert path
my @r;
foreach my $e (@ARGV) {
    if ($opt{w}) {
        # add drive letter suffix
        $e =~ s,^\/([A-Za-z])\/,\1:\/,;
        $e =~ s,\/,\\,g;

    } else {
        $e =~ s,\\,\/,g;
        # add leading slash
        $e = "/$e";
        # remove drive letter suffix
        $e =~ s,:,,;
    }

    Push @r, $e;
}

print join("\n", @r);

Cygwinと比較してcygpath

このプログラムからの出力は、MSYSのCygwin cygpathからの出力よりも優れています。

  • Cygwin cygpath変換されたパスからCygwinホームを削除します。
cygpath "$CYGWIN/usr/local/bin"
/usr/local/bin

これは問題です

  • cygwinからMSYSにファイルをコピーするために、DOS CygwinパスをUNIXパスに変換すると便利な場合があります。

このプログラムはCygwinホームを削除しません

cygpath "$CYGWIN/usr/local/bin"
/c/file/program/cygwin/usr/local/bin

自動MSYSパス変換と比較

手動パス変換はMSYSで使用されます。

  • 自動パス変換が不十分です

のために.

3
John Peterson

これはどう ? cmd //c echo <your path>

常に機能するとは限りませんが、私が見つけた最短のものです