msys路径转换(或msys的cygpath?)

Pav*_*l P 32 portability path msys mingw32 cygpath

我需要将/DEF:c:\filepath\myLib.def"命令行选项从bash脚本传递给MS编译器/链接器.该路径是作为构建过程的一部分由bash脚本生成的.基本上,我的脚本的参数通行证是:

-DEF:/c/filepath/myLib.def
Run Code Online (Sandbox Code Playgroud)

MSYS路径转换无法正确处理它,因为它不了解/DEF:部分.如果我这样做的话

-DEF=/c/filepath/myLib.def
Run Code Online (Sandbox Code Playgroud)

但是ms工具不理解这个参数.简而言之,在MSYS bash中编写该参数的正确方法是什么,以便将其转换为正确的参数?

在cygwin上我可以使用cygpath,但没有相应的,因为msys的某些人认为它不需要(即使cygwin的脚本使用cygpath).

Pav*_*l P 44

更新(2016年8月):

这个问题不再适用,因为msys2现在已经cygpath安装了.

...

我将在这里总结一下我的研究.

MSYS中的cygpath等效命令是使用此命令:

{ cd /c/some/path && pwd -W; } | sed 's|/|\\|g'
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于它需要现有路径,例如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'
Run Code Online (Sandbox Code Playgroud)

满口的斜线是为了满足引用规则sed.因此,如果c:\some\path您的PC上不存在,它将尝试转换为正斜杠并替换/c/c:\(或任何其他驱动器号).唯一的缺点是它无法正确运行包含已安装组件的不存在路径,例如/bin/does-not-exist/usr/bin/does-not-exist.

一种方法是在MSYS中使用来自cygwin的cygpath.似乎cygwin设置了全局环境变量CYGPATH,也就是说,你可以从常规的cmd.exe中使用它:

%CYGPATH% -w /c/some/path
C:\some\path
Run Code Online (Sandbox Code Playgroud)

或来自MSYS:

$CYGPATH -w /c/some/path
C:\some\path
Run Code Online (Sandbox Code Playgroud)

只要你设置为指向/c/cygdrive/cCygwin中.但是这种方法会打印出你/usr在cygwin安装中的位置,而不是在MSYS中.

简而言之,我认为msys应该在默认的工具集中包含真正的cygpath,仅适用于msys命令行参数转换逻辑无法自动处理的某些情况


Ale*_* V. 9

使用 pwd -W

或者从这里下载msys的cygpath http://mingw.5.n7.nabble.com/enhanced-version-of-cygpath-td28556.html

并使用 cygpath -wa


TJR*_*TJR 7

与上面的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/'
}
Run Code Online (Sandbox Code Playgroud)


小智 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
}
Run Code Online (Sandbox Code Playgroud)