Как анализируются параметры оболочки? - PullRequest
0 голосов
/ 04 сентября 2018

Я использовал этот простой скрипт с именем echo_arg в msys shell

echo $1
echo $2
echo $3

Для этих 2 случаев, вызванных из CLI,

  1. $ C:/msys/1.0/bin/sh.exe -c "C:/msys/1.0/bin/sh.exe echo_arg a "b" c"
  2. $ C:/msys/1.0/bin/sh.exe -c "C:/msys/1.0/bin/sh.exe echo_arg a \"b\" c"

вывод был

a
b
c

Но Функция CreateProcess в C-программе не дала того же результата (компиляция с 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 ); }

}

Ouput:
C: /msys/1.0/bin/sh.exe -c "C: /msys/1.0/bin/sh.exe echo_arg a" b "c"
a
б
с
C: /msys/1.0/bin/sh.exe -c "C: /msys/1.0/bin/sh.exe echo_arg a \" b \ "c"
a
Ьс

C: /msys/1.0/bin/sh.exe -c "/bin/sh.exe echo_arg a \" b \ "c"
a
b
с

Почему во втором случае b и c не разделены ($ 2 = "b c" и $ 3 пусто)? И почему случай 3 сработал.

Только для информации, я не сумасшедший, который любит играть с "\ \" / ... Я столкнулся с этой проблемой, когда пытался установить библиотеку GNU MP (ОС: Windows 10). Это не сработало, и это было началом длинной истории, прежде чем я нашел причину.

...