我遇到了一种奇怪的行为(像往常一样),我尝试在 (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 中实现此功能?
谁能解释一下这是怎么回事?
令人尴尬的是,
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。如果对这种差异有更好的解释,我很乐意接受替代答案。