【问题标题】:How to prevent MSYS to convert the file path for an external program如何防止 MSYS 为外部程序转换文件路径
【发布时间】:2015-02-16 02:23:52
【问题描述】:

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

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

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

例如,

adb shell cat /proc/version

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

adb shell cat C:/Program Files (x86)/Git/proc/version

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

adb shell "cat /proc/version"

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

我使用的 MinGW 附带“Git for Windows”包。

已编辑:我还打了另一个 scnario,我无法解决双引号。

$ 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

【问题讨论】:

    标签: mingw filepath mingw-w64


    【解决方案1】:

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

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

    MSYS_NO_PATHCONV=1
    

    例如

    MSYS_NO_PATHCONV=1 adb shell cat /proc/version
    

    注意:程序可能无法正常运行,因为它们需要 Windows 路径。

    要解决此问题,您可以使用documentation page 中提到的转义(查看底部):

    adb shell cat //proc\version
    

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

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

    adb shell cat //proc\\version
    

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

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

        【解决方案3】:

        请问,我们可以在这里获取术语吗? MinGW 没有路径翻译,如您所描述的;它是 MSYS 构建环境,由 MinGW.org 作为 MinGW 的伴侣提供,它执行此操作,所以我猜你实际上使用的是 Git for Windows 提供的 MSYS 版本。

        我很高兴您找到了适用于您的情况的灵丹妙药,但请注意,在某些极端情况下,这种“双斜线”技巧是不够的;如果您遇到其中一种情况,您可能希望将 Cygwin 视为 Windows 上的替代托管 shell。

        【讨论】:

        • 事实上,MinGW 是 GCC 的原生 Windows 构建,伴随着进一步的原生构建工具,这些工具是对 GCC 工具链的补充。 MinGW 集合中的所有工具都使用原生 Windows 路径;他们不需要像你描述的那样执行路径转换。
        • MSYS 是 Cygwin 早期版本的一个分支子集,经过修改,它与 MinGW 工具的协作(通常)比 Cygwin 更好;它特别适合在用于 POSIX 系统的 makefile 的指导下使用 MinGW 管理项目构建。当任何 MSYS 工具将执行移交给 MinGW 工具(或任何其他本机 Windows 应用程序)时,MSYS 执行路径转换。 (AIUI、Cygwin 也可以做类似的翻译,但不那么透明)。
        • 感谢您的澄清。我刚刚改了标题。
        猜你喜欢
        • 1970-01-01
        • 2012-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多