我在 msys shell中使用了这个简单的脚本,名为 echo_arg
echo $1
echo $2
echo $3
对于这2种情况(从CLI调用)
$ C:/msys/1.0/bin/sh.exe -c "C:/msys/1.0/bin/sh.exe echo_arg a "b" c"
$ C:/msys/1.0/bin/sh.exe -c "C:/msys/1.0/bin/sh.exe echo_arg a \"b\" c"
输出为
a
b
c
但是 C程序中的CreateProcess函数没有给出相同的结果(使用mingw-w64编译,线程:win32,异常:seh,版本:7.3.0)
#include <windows.h>
#include <stdio.h>
void main( int argc, char *argv[] )
{
int i;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
char * cmd[] = {
"C:/msys/1.0/bin/sh.exe -c \"C:/msys/1.0/bin/sh.exe echo_arg a \"b\" c\"", \
"C:/msys/1.0/bin/sh.exe -c \"C:/msys/1.0/bin/sh.exe echo_arg a \\\"b\\\" c\"", \
"C:/msys/1.0/bin/sh.exe -c \"/bin/sh.exe echo_arg a \\\"b\\\" c\"" } ;
for (i=0;i<3;i++) {
printf("\t%s\n",cmd[i]);
CreateProcess(NULL, cmd[i] , NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread ); }
}
输出:
C:/msys/1.0/bin/sh.exe -c“ C:/msys/1.0/bin/sh.exe echo_arg a” b“ c”
a
b
c
C:/msys/1.0/bin/sh.exe -c“ C:/msys/1.0/bin/sh.exe echo_arg a \” b \“ c”
a
bc
C:/msys/1.0/bin/sh.exe -c“ /bin/sh.exe echo_arg a \” b \“ c”
a
b
c
在第二种情况下,为什么b和c不分开($ 2 =“ b c”且$ 3为空)?以及为什么案例3奏效。
仅作参考,我不是一个喜欢玩“ \\” / ...的疯子。当我尝试安装GNU MP库(OS:Windows 10)时遇到了这个问题。它没有用,这是一个漫长的故事的开始,直到我找到原因为止。