Proposal: Add showCommandForUser to process:System.Process

Edward Z. Yang ezyang at MIT.EDU
Tue Sep 14 22:45:32 EDT 2010


+1 for the general principal.

I'm a little ambivalent about changing quoting rules depending on the
operating system: the operating system does not necessitate a particular
shell.  A more general API might be to support a variety of quoting
styles, but that might be a smidge overkill.

Cheers,
Edward

Excerpts from Ian Lynagh's message of Sun Sep 12 08:24:24 -0400 2010:
> 
> Add showCommandForUser to process:System.Process
> http://hackage.haskell.org/trac/ghc/ticket/4305
> 
> There are many programs (e.g. ghc and Cabal) which run other programs,
> and when run with -v want to show the user what they are running. The
> user then often wants to run the command by hand, in order to debug a
> problem, but this can be tricky when the command or its arguments
> include spaces or other characters treated specially by shells.
> 
> This proposal is for a System.Process.showCommandForUser function in the
> process package, such that showCommandForUser cmd args can be copied and
> pasted directly into a shell.
> 
> I would have put this in System.Cmd, except that module is earmarked to
> be deprecated.
> 
> The code already existed within System.Process; I've just rearranged it
> a bit:
> 
>     showCommandForUser :: FilePath -> [String] -> String
>     showCommandForUser cmd args = unwords (map translate (cmd : args))
> 
>     translate :: String -> String
>     #if mingw32_HOST_OS
>     translate str = '"' : snd (foldr escape (True,"\"") str)
>       where escape '"'  (b,     str) = (True,  '\\' : '"'  : str)
>             escape '\\' (True,  str) = (True,  '\\' : '\\' : str)
>             escape '\\' (False, str) = (False, '\\' : str)
>             escape c    (b,     str) = (False, c : str)
>     #else
>     translate str = '\'' : foldr escape "'" str
>       where escape '\'' = showString "'\\''"
>             escape c    = showChar c
>     #endif
> 
> The fallback for rawSystem is now
> 
>     rawSystem cmd args = system (showCommandForUser cmd args)
> 
> except with hugs on Windows, where for some reason it's
> 
>     rawSystem cmd args = system (cmd ++ showCommandForUser "" args)
> 
> which is surely wrong, but how it behaved before.
> 
> 
> Discussion period: 2 weeks, until 26 Sep 2010.
> 
> 
> Thanks
> Ian
> 


More information about the Libraries mailing list