Proposal: Add showCommandForUser to process:System.Process

Ian Lynagh igloo at earth.li
Sun Sep 12 08:24:24 EDT 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