#5376: Quotation in System.Process.system for Windows
---------------------------------+------------------------------------------
    Reporter:  simonpj           |        Owner:              
        Type:  bug               |       Status:  new         
    Priority:  normal            |    Milestone:              
   Component:  Compiler          |      Version:  7.0.4       
    Keywords:                    |     Testcase:              
   Blockedby:                    |   Difficulty:              
          Os:  Unknown/Multiple  |     Blocking:              
Architecture:  Unknown/Multiple  |      Failure:  None/Unknown
---------------------------------+------------------------------------------
 Wagnerdm writes: I had a bit of fun recently tracking down quoting issues
 with the "`system`" command in Windows. For the examples below, I'll
 consistently use "`Windows> `" as the beginning of some text sent to the
 Windows command prompt cmd.exe, and use "`GHC> `" as the beginning of some
 text sent to a ghci session running in cmd.exe with `System.Cmd` imported.

 The situation is this: I want to hand off a command line which has both a
 possibly-quoted command name and a (definitely) quoted argument. For
 concreteness, let's use "more" as the command and "foo.txt" as the
 argument, so that you can follow along at home on your favorite Windows
 system.
 {{{
 Windows> echo foo > foo.txt
 Windows> "more" "foo.txt"
 foo
 }}}
 All good so far. But:
 {{{
 GHC> system "\"more\" \"foo.txt\""
 'more" "foo.txt' is not recognized as an internal or external command,
 operable program or batch file.
 ExitFailure 1
 }}}
 After some digging, I discovered that system is shipping out to cmd /c,
 and indeed:
 {{{
 Windows> cmd /c "more" "foo.txt"
 'more" "foo.txt' is not recognized as an internal or external command,
 operable program or batch file.
 }}}
 I don't know what the *right* fix is. However, after a bit of playing
 around, I discovered the following:
 {{{
 Windows> cmd /c ""more" "foo.txt""
 foo
 GHC> system "\"\"more\" \"foo.txt\"\""
 foo
 ExitSuccess
 }}}
 Wrapping commands with an extra pair of double-quotes this way seemed to
 give behavior matching the bare cmd.exe for all the examples I could think
 of, even ones I thought it would break. For example:
 {{{
 GHC> system "\"more foo.txt\""
 foo
 ExitSuccess
 }}}
 If this turns out to be the right thing to do, it's pretty easy to
 implement. In the `commandToProcess` function, at
 `libraries/process/System/Process/Internals.hs:455`, the change is just
 {{{
 -   return (cmd, translate cmd ++ "/c " ++ string)
 +   return (cmd, translate cmd ++ "/c \"" ++ string ++ "\"")
 }}}
 (And in any case, the examples above should answer this amusing comment,
 immediately following those lines:
 {{{
         -- We don't want to put the cmd into a single
         -- argument, because cmd.exe will not try to split it up.
 Instead,
         -- we just tack the command on the end of the cmd.exe command
 line,
         -- which partly works.  There seem to be some quoting issues, but
         -- I don't have the energy to find+fix them right now (ToDo).
 --SDM
         -- (later) Now I don't know what the above comment means.  sigh.
 }}}
 Later, Brandon comments: What that comment means is that how CMD.EXE
 handles spaces is Windows-version-dependent.  On the other hand, I
 ''think'' it's mostly consistent between XP and Windows 7 --- and I feel
 sorry for anyone forced to use an older version.

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/5376>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler

_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to