`run "perl6" ...` can be made to execute shell commands #6591
On Windows, cmd.exe has different quoting for arguments than CreateProcess() and according to a Microsoft's blog[^1] there's no one-size-fits all solution.
While run() will quote stuff just fine for non-cmd.exe programs, `perl6` executable on Windows is a batch file, which makes `run 'perl6', ...` go through
run $*EXECUTABLE, '-e', '"&whoami'; # executes `whoami` on the shell, as can be seen by output at the end
The same problem exists with Perl's system:
system 'perl6', ('-e', '"" &whoami'); # executes `whoami` on the shell
So I'd assume the problem can't be solved entirely behind the scenes, precisely because there's no one-size-fits all solution.
However, even in Rakudo's own test suite there are `run`s that run $*EXECUTABLE, feeding it improperly quoted arguments.
So I think we need to:
1) Find a way to un-batch it. Make `perl6` a proper executable
Worse still; there doesn't seem to be a way to make `run` work with `cmd.exe` commands at all. Even if you escape the args yourself properly, they seem to get butchered by libuv's quoting. There's a UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS that'd avoid quoting, though currently we have it off (so non-cmd.exe args get processed right)