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命令行参数转换逻辑无法自动处理的某些情况
使用 pwd -W
或者从这里下载msys的cygpath http://mingw.5.n7.nabble.com/enhanced-version-of-cygpath-td28556.html
并使用 cygpath -wa
与上面的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)