Euphoria
Ticket #547:
system_exec() should accept spaces
-
Reported by
jeremy
Dec 14, 2010
Details
1. Comment by jimcbrown
Dec 17, 2010
I don't know if that is so easy. The problem is that Windows programs get the entire command line as a single string, either from GetCommandLine() or passed in the call to WinMain().
http://www.eggheadcafe.com/software/aspnet/30326000/getcommandline-question.aspx
http://bytes.com/topic/c/answers/740171-command-line-options-winmain-__argv
spawn() has to be a wrapper around CreateProcess() at some level. And CreateProcess() only accepts a single big string. http://msdn.microsoft.com/en-us/library/ms682425(v=vs.85).aspx
The easiest way to fix this might be to call C's system() for Euphoria's system_exec() on WIndows, the same as we already do for Unix. This will make system_exec() do the right thing if system() already does the right thing.
Speaking of which, a peeve I have is that the current options in the stdlib to start a program (system(), system_exec(), pipeio:create() / pipeio:exec() ) all require passing a string. Unix allows one to specify the argv directly and pass that to the child process, with no shell globbing or quoting getting in the way. Why don't we have a function to do that?
2. Comment by SDPringle
Nov 22, 2011
Remember we have build_commandline() to bridge the gap between UNIX style string array exec() to Windows single string with spaces. Clearly system_exec() accepts spaces to separate arguments. Did Jeremy mean spaces in the the program's path?
3. Comment by jimcbrown
Nov 22, 2011
I think I wrote that before we had build_commandline(). Anyways, that's not good enough for me.
By directly calling execvp(), you can do weird things like pass in a fake program name to the program being run.
Jeremy's original request was to be able to use spaces in quoted strings as parameters. e.g.
run.exe "This is one param" "This is param two" and_three "and so on"
4. Comment by SDPringle
Nov 22, 2011
In UNIX you can do this by using EUPHORIA's C interface. It seems it would be neither commonly used nor could it be simulated well under Windows via build_commandline() in all cases.
5. Comment by jimcbrown
Nov 23, 2011
Oll Korrect. You have to wrap it yourself though, but the point that this might be so rarely used that it's not worth wrapping and adding to the stdlib is a point worth .. er ..