mingw: аргументы специального случая для sh
Среда выполнения MSYS2 делает все возможное, чтобы эмулировать подстановочные знаки командной строки и удаление из кавычек, которые будут выполняться вызывающей оболочкой Unix в системах Unix.
Эти правила цитирования оболочки Unix отличаются от правил цитирования, применяемых к cmd и Powershell в Windows, поэтому немного неудобно правильно указывать параметры командной строки при порождении других процессов.
В частности, git.exe
передает аргументы подпроцессам, которые не предназначены для интерпретации как подстановочные знаки, и если они содержат обратную косую черту, они не должны интерпретироваться как escape-символы, например, при прохождении путей Windows.
Примечание: это проблема только при вызове исполняемых файлов MSYS2, а не при вызове исполняемых файлов MINGW, таких как git.exe. Однако мы часто вызываем исполняемые файлы MSYS2, особенно при установке флага use_shell
в структуре child_process.
Не существует элегантного способа определить, является ли исполняемый файл .exe
программой MSYS2 или MINGW.
Но так как прецедент передачи командной строки через оболочку настолько распространен, нам нужно обойти эту проблему по крайней мере при выполнении sh.exe
.
Давайте введем уродливый, жестко закодированный тест, является ли argv[0]
"sh
", и
относится ли это к MSYS2 Bash, чтобы определить, нужно ли нам
цитируйте аргументы иначе, чем обычно.
Это все еще не решает проблему полностью, но по крайней мере это что-то.
Кстати, это также устраняет проблему, когда git clone \\server\repo
не удался из-за неправильной обработки обратных косых черт при передаче пути к процессу git-upload-pack
.
Кроме того, мы должны позаботиться о том, чтобы указывать не только пробел и обратную косую черту, но и фигурные скобки.
Поскольку псевдонимы часто проходят через MSYS2 Bash, и поскольку псевдонимы часто получают параметры, такие как HEAD@{yesterday}
, это действительно важно.