41

/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のスクリプトがある場合でも)。

4

8 に答える 8

56

更新(2016年8月):

msys2がインストールに含まれるようになったため、この質問はもはや関係ありませんcygpath

..。

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

MSYSで同等のcygpathは、次のコマンドを使用することです。

{ 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\pathPCに存在しない場合は、スラッシュからバックスラッシュに変換し、(または他のドライブ文字)に置き換えようとし/c/ますc:\/bin/does-not-existこれの唯一の欠点は、またはなどのマウントされたコンポーネントを含む存在しないパスが正しく機能しないこと/usr/bin/does-not-existです。

もう1つのアプローチは、MSYSでcygwinのcygpathを使用することです。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ただし、このアプローチ/usrでは、MSYSではなくcygwinインストールにあるユーザーが印刷されます。

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

于 2012-08-21T21:57:23.423 に答える
14

使用するpwd -W

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

と使用cygpath -wa

于 2013-08-28T12:36:08.820 に答える
8

上記の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/'
}
于 2014-10-01T04:36:26.570 に答える
6

私はこれを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
}
于 2013-03-15T14:10:54.330 に答える
3

私のbashfooは弱く、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);
于 2012-08-21T19:22:09.520 に答える
3

MSYScygpath

プログラム

このプログラムは、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

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

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

これは問題です

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

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

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

自動MSYSパス変換との比較

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

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

feの場合

于 2013-07-13T19:28:59.823 に答える
3

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

いつもうまくいくとは限りませんが、私が見つけた最短のものです

于 2015-11-19T13:49:09.310 に答える
0

これは私のために働く

df "$1" | tac >k
read b <k
rm k
set "$1" $b
echo ${1/$7/$2/}

ref

于 2013-01-30T08:11:23.173 に答える