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

msys路径转换(或msys的cygpath?),path,portability,mingw32,msys,cygpath,Path,Portability,Mingw32,Msys,Cygpath,我需要将/DEF:c:\filepath\myLib.DEF“命令行选项从bash脚本传递到MS编译器/链接器。路径是由bash脚本作为构建过程的一部分生成的。基本上,我的脚本传递的参数是: -DEF:/c/filepath/myLib.def 无法正确处理它,因为它不理解/DEF:部分。如果我理解,它会工作 -DEF=/c/filepath/myLib.def 但是ms tools不理解这个参数。简而言之,在MSYS bash中写入该参数以便将其转换为正确的参数的正确方法是什么 在cygw

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

-DEF:/c/filepath/myLib.def
无法正确处理它,因为它不理解
/DEF:
部分。如果我理解,它会工作

-DEF=/c/filepath/myLib.def
但是ms tools不理解这个参数。简而言之,在MSYS bash中写入该参数以便将其转换为正确的参数的正确方法是什么


在cygwin上,我可以使用cygpath,但没有等效的,因为msys的人认为不需要它(即使有cygwin的脚本使用cygpath)。

我的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);
更新(2016年8月):

这个问题不再相关,因为现在它的安装中出现了
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\path
,它会尝试将前斜杠转换为后斜杠,并将
/c/
替换为
c:\
(或任何其他驱动器号)。唯一的缺点是它无法正常工作包含已安装组件的不存在路径,例如
/bin/不存在
/usr/bin/不存在

还有一种方法是在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
。 但这种方法将打印您位于cygwin安装中的
/usr
,而不是在MSYS中

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

df“$1”| tac>k

阅读b我将此与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
}
MSYS
cygpath
节目 此程序将DOS路径转换为UNIX路径,反之亦然

#!/bin/env perl
#DOS到UNIX路径转换
#©John S.Peterson.许可证GNU GPL 3。
严格使用;
使用Getopt::Std;
#用法
如果($#ARGV==-1){
“打印”用法:cygpath(-w)名称。。。
转换Unix和Windows格式路径
输出类型选项:
-w、 --windows打印windows窗体的名称(C:\WINNT)
';
出口0;
}
#选择权
我的%opt;
getopts('w',\%opt);
#转换路径
我的@r;
每个我的$e(@ARGV){
如果($opt{w}){
#添加驱动器号后缀
$e=~s,^\/([A-Za-z])\/,\1:\/,;
$e=~s,\/,\\,g;
}否则{
$e=~s,\\,\/,g;
#添加前导斜杠
$e=“/$e”;
#删除驱动器号后缀
$e=~s,:,,;
}
推动@r$e;
}
打印联接(“\n”、@r);
与Cygwin相比
cygpath
此程序的输出优于MSYS中Cygwin
cygpath
的输出,因为

  • Cygwin
    cygpath
    将Cygwin home从转换的路径中移除,f.e
这是一个问题,因为

  • 为了将文件从Cygwin复制到MSYS,有时将DOS Cygwin路径转换为UNIX路径很有用
此程序不会删除Cygwin home

cygpath "$CYGWIN/usr/local/bin"
/c/file/program/cygwin/usr/local/bin
与自动MSYS路径转换相比 手动路径转换在MSYS中有用途,因为

  • 自动路径转换不充分
为了f.e


    • 使用
      pwd-W

      或 从此处下载用于msys的cygpath


      使用与上面dmitri rubinstein@类似的
      cygpath-wa

      ,我对代码进行了一些清理,并添加了反向转换

      winpath(){
      如果[${}-eq 0];那么
      :跳过
      elif[-f“$1”];然后
      本地目录名=$(目录名“$1”)
      本地basename=$(basename“$1”)
      echo“$(cd“$dirname”和&pwd-W)/$basename”\
      |塞德\
      -e's |/| \\\\| g';
      elif[-d“$1”];然后
      echo“$(cd“$1”和&pwd-W)”\
      |塞德\
      -e's |/| \\\\| g';
      其他的
      回音“$1”\
      |塞德\
      -e's | ^/\(.\)/\1:\\\\\\124; g'\
      -e's |/| \\\\| g'
      fi
      }
      unixpath(){
      回音“$1”\
      |sed-r\
      -e's//\\//\//g'\
      -e的/^([^:::+):/\/\1/'
      }
      
      这个怎么样?
      cmd//c echo


      它可能不会一直工作,但它是我发现的最短的,我知道如何使用脚本;我认为有一些MSYS特定的方法引用参数,以便它自动转换此路径。这就是我要寻找的。您是否尝试过我自己的解决方案:
      sh-c'cd/c/some/path;pwd-W'
      ?它在功能上等同于
      cycygwin上的gpath-w'/c/some/path'
      。您的解决方案可能具有cygpath的功能,但不清楚如何将其转换为类似cygpath的命令。它与我自己的答案有什么不同?我提供了指向cygpath.exe的链接,该链接可能与cygwin不同。提供的链接提供了一个无法正常工作的cygpath。例如,
      cygpath-w/c/foobar
      打印
      c:/foobar
      ,而它应该打印
      c:\foobar
      “这一论点可以延伸很长一段路。但有时它很有用,例如Jython的shell脚本允许Cygwin,但不允许MSYS。Jython的shell脚本调用
      cygpath
      。如果我们从@user13079添加
      cygpath.exe
      cygpath "$CYGWIN/usr/local/bin"
      /c/file/program/cygwin/usr/local/bin