为什么 MSYS Bash 没有按预期评估 Windows 可执行命令?

问题描述 投票:0回答:1

我遇到了一种奇怪的行为(像往常一样),我尝试在 (MSYS) Bash 别名中使用 Windows 可执行文件来执行命令并处理结果。

有问题的 Windows 程序是

dumpbin.exe
,作为 VS 工具的一部分,可以在 version 依赖位置找到:
'C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\bin\Hostx64\x64\

这就是我正在尝试做的事情:

dumpbin /dependents some.exe

所以我创建了一个像这样的 Bash 函数:

function show_deps () {
    local DBPATH='C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\bin\Hostx64\x64\'
    "${DBPATH}"/dumpbin.exe /dependents $1
}

# show_deps some.exe

Microsoft (R) COFF/PE Dumper Version 14.41.34123.0
Copyright (C) Microsoft Corporation.  All rights reserved.

Dump of file C:\msys64\dependents
LINK : fatal error LNK1181: cannot open input file 'C:\msys64\dependents'

因此命令运行,但无论我尝试什么,参数总是变成“

\dependents
”。 于是我想尝试使用
eval
命令:

DBPATH='/c/Program\ Files/Microsoft\ Visual\ Studio/2022/Community/VC/Tools/MSVC/14.41.34120/bin/Hostx64/x64/dumpbin.exe'

EXE_ARGS="/dependents some.exe"; eval "${DBPATH} ${EXE_ARGS}"

# Again same issue: 
...
Dump of file C:\msys64\dependents
LINK : fatal error LNK1181: cannot open input file 'C:\msys64\dependents'

# So I try without the argument: 
EXE_ARGS="some.exe"; eval "${DBPATH} ${EXE_ARGS}"
...
Dump of file some.exe

File Type: EXECUTABLE IMAGE

  Summary

        3000 .bss
        1000 .buildid
        1000 .data
        3000 .debug_abbrev
...
# OK!

因此该命令可以工作,但不能带参数!

现在凶手来了…… 在 Cygwin(使用较旧的 Bash 版本)中,相同的功能可以工作!

function show_deps () {
    local DBPATH='C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.41.34120\bin\Hostx64\x64\'
    "${DBPATH}"/dumpbin.exe /dependents $1
}

# show_deps some.exe

Microsoft (R) COFF/PE Dumper Version 14.41.34123.0
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file some.exe

File Type: EXECUTABLE IMAGE

  Image has the following dependencies:

    cygconfuse-1.dll
    cygwin1.dll
    KERNEL32.dll

  Summary

        3000 .bss
        1000 .buildid
        1000 .data
        3000 .debug_abbrev
        1000 .debug_aranges
        2000 .debug_frame
       13000 .debug_info
        5000 .debug_line
        2000 .debug_line_str
        1000 .debug_loclists
        1000 .debug_rnglists
        1000 .debug_str
        1000 .idata
        1000 .pdata
        3000 .rdata
        1000 .reloc
        1000 .rsrc
        C000 .text
        1000 .xdata

如何在 MSYS bash 中实现此功能?
谁能解释一下这是怎么回事?

windows msys
1个回答
0
投票

令人尴尬的是,

MSYS
Cygwin
中的默认 Bash 设置对
/
的解释似乎不同。很可能是因为 Cygwin 在一定程度上接受 Windows 路径 (
C:\the\path
),而 MSYS 根本不接受,并且纯粹依赖于 POSIX 路径,即
/the/path

经过大量的尝试和错误,并且在Philippe的建议下,我发现正斜杠需要加倍。我仍然不明白到底为什么,因为我也尝试将它包含在单个完全中(

'
),在变量扩展后永远不应该以任何方式解释它,所以它发生在其他地方。

这按预期工作:

DBPATH='/c/Program\ Files/Microsoft\ Visual\ Studio/2022/Community/VC/Tools/MSVC/14.41.34120/bin/Hostx64/x64/dumpbin.exe' 
EXE_ARGS=" //dependents some.exe"
eval "${DBPATH} ${EXE_ARGS}"

PS。如果对这种差异有更好的解释,我很乐意接受替代答案。

© www.soinside.com 2019 - 2024. All rights reserved.