如何防止 MSYS 转换外部程序的文件路径

Ton*_*ony 9 mingw filepath mingw-w64

我正在将 Linux 脚本移植到 Windows 和 MinGW,它通过 ADB 访问 Android 手机。

有时我需要将 Android 的文件路径作为 ADB 命令行选项传递。

但是,在调用 ADB.exe 时,MinGW 会将其转换为 Windows 的路径。

例如,

adb shell cat /proc/version
Run Code Online (Sandbox Code Playgroud)

翻译如下,导致Android中出现“No such file or directory”错误。

adb shell cat C:/Program Files (x86)/Git/proc/version
Run Code Online (Sandbox Code Playgroud)

我发现双引号有助于防止这种情况。

adb shell "cat /proc/version"
Run Code Online (Sandbox Code Playgroud)

但是是否有任何全局 siwtches 或 env 变量来阻止 MinGW 进行此转换?

我正在使用的 MinGW 带有“Git for Windows”包。

编辑:我还遇到了另一个 snario,我无法解决双引号问题。

$ adb push test1.mp3 /data
failed to copy 'test1.mp3' to 'C:/Program Files (x86)/Git/data': No such file or directory

$ adb push test1.mp3 "/data"
failed to copy 'test1.mp3' to 'C:/Program Files (x86)/Git/data': No such file or directory
Run Code Online (Sandbox Code Playgroud)

izo*_*fif 8

但是是否有任何全局开关或环境变量来阻止 MinGW 进行此转换?

是的。使用这个环境变量:

MSYS_NO_PATHCONV=1
Run Code Online (Sandbox Code Playgroud)

例如

MSYS_NO_PATHCONV=1 adb shell cat /proc/version
Run Code Online (Sandbox Code Playgroud)

当心:程序可能无法正常工作,他们期望 Windows 路径。

要解决此问题,您可以使用文档页面上提到的转义(查看底部):

adb shell cat //proc\version
Run Code Online (Sandbox Code Playgroud)

规则:第/一个参数重复,其余/替换为\

根据使用的转义(例如在 .sh 脚本中),您可能需要复制\字符:

adb shell cat //proc\\version
Run Code Online (Sandbox Code Playgroud)

这样,只会传递使用额外/前缀编写的参数,而不会转换为 Windows 路径。


Ton*_*ony 6

刚发现开始双斜线是魅力。

https://web.archive.org/web/20201112005258/http://www.mingw.org/wiki/Posix_path_conversion

以 2 或更多开头的参数/被认为是转义的 Windows 样式开关,将在/删除前导并全部\更改为/.

除了如果/的前导块后面有一个/,则该参数被认为是 UNC 路径,并且/不会删除前导。

| Argument from MSYS program | Sent to native Windows program as | Sent to native Windows program as
| //foobar                   | /foobar                           | double /  prevents conversion
| //foo\bar                  | /foo/bar                          | \  converted to /
| //foo/bar                  | //foo/bar                         | interpreted as UNC path, leading /  not removed
Run Code Online (Sandbox Code Playgroud)