@whitequark
I think you’re conflating a couple of things here. The big problem with CreateProcess is that they take a single string for all command-lime arguments, whereas execve takes a vector of arguments. This is the root cause of a load of quoting errors because there is no way of passing multiple arguments to a child process on Windows that doesn’t involve quoting them. And, because this API is used directly, everyone rolls their own quoting code to go from their internal vector-of-arguments representation to the child process’s one.
This has nothing to do with glob expansion, which happens later after you’ve split arguments. And on UNIX-like systems, doing it on the shell causes all sorts of weird behaviour. For example, on FreeBSD, I often do pkg info foo* to print info about packages that start with some string. If I forget to quote the last argument, this behaves differently depending on whether the current directory contains one or more files that have the prefix that I used. If they do, the shell expands them and pkg info returns nothing because I don’t have any installed packages that match those files. If they don’t, the shell passes the star to the program, which does glob expansion but against a namespace that is not the filesystem namespace. The pkg tool knows that this argument is a set of names of installed packages, not files in the current directory, but it can’t communicate that to the shell and so the shell does the wrong thing.
Similarly, on DOS the rename command took a load of source files and a destination file or pattern. You could do rename *.c *.txt and it would expand the first pattern, then do the replacement based on the two patterns. UNIX’s mv can’t do that and I deleted a bunch of files by accident when I started using Linux because it’s not obvious to a user what actually happens when you write mv *.c *.txt. There is a GNU (I think?) rename command and its syntax is far more baroque than the DOS one because it is fighting against the shell doing expansion without any knowledge of the argument structure.