Chapter 20. Systems Programming in Haskell
So far, we’ve been talking mostly about high-level concepts. Haskell can also be used for lower-level systems programming. It is quite possible to write programs that interface with the operating system at a low level using Haskell.
In this chapter, we are going to attempt
something ambitious: a Perl-like “language” that is valid Haskell,
implemented in pure Haskell, that makes shell scripting easy. We are going to implement piping, easy
command invocation, and some simple tools to handle tasks that might
otherwise be performed with grep
or
sed
.
Specialized modules exist for different operating systems. In this chapter, we will use generic OS-independent modules as much as possible. However, we will be focusing on the POSIX environment for much of the chapter. POSIX is a standard for Unix-like operating systems such as Linux, FreeBSD, MacOS X, or Solaris. Windows does not support POSIX by default, but the Cygwin environment provides a POSIX compatibility layer for Windows.
Running External Programs
It is possible to invoke external commands from Haskell. To do that, we
suggest using rawSystem
from
the System.Cmd
module. This will
invoke a specified program, with the specified arguments, and return the
exit code from that program. You can play with it in ghci:
ghci>
:module System.Cmd
ghci>
rawSystem "ls" ["-l", "/usr"]
Loading package old-locale-1.0.0.0 ... linking ... done. Loading package old-time-1.0.0.0 ... linking ... done. Loading package ...
Get Real World Haskell now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.