msys路径转换(或msys的cygpath?)
我需要将/DEF:c:\filepath\myLib.DEF“命令行选项从bash脚本传递到MS编译器/链接器。路径是由bash脚本作为构建过程的一部分生成的。基本上,我的脚本传递的参数是: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
无法正确处理它,因为它不理解/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
}
MSYScygpath
节目
此程序将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中Cygwincygpath
的输出,因为
- 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