diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -64,9 +64,13 @@
 For some this is an absolutely critical feature, particularly given that Haskell does not yet offer up stack traces.
 
 
-### Haskell supplements
+### Haskell file-finding supplements
 
-* [FileManip](hackage.haskell.org/package/FileManip) - more efficient file finding code (uses Lazy IO). Shelly's finders are currently being re-worked
+* [find-conduit](http://hackage.haskell.org/package/find-conduit) - uses conduits, similar speed to GNU find
+* [FileManip](hackage.haskell.org/package/FileManip) - uses Lazy IO
+
+Shelly's finders load all files into memory. This is simpler to use if you control the filesystem structure and know the system is bounded in size. However, if the filesystem structure is unbounded it consumes unbounded memory.
+
 
 ### Shell commands with richer input/output
 
diff --git a/shelly.cabal b/shelly.cabal
--- a/shelly.cabal
+++ b/shelly.cabal
@@ -1,6 +1,6 @@
 Name:       shelly
 
-Version:     1.6.3.2
+Version:     1.6.3.3
 Synopsis:    shell-like (systems) programming in Haskell
 
 Description: Shelly provides convenient systems programming in Haskell,
@@ -41,7 +41,7 @@
                     README.md
 
 Library
-  Exposed-modules: Shelly, Shelly.Lifted, Shelly.Pipe
+  Exposed-modules: Shelly, Shelly.Lifted, Shelly.Pipe, Shelly.Unix
   other-modules:   Shelly.Base, Shelly.Find
   hs-source-dirs: src
 
@@ -88,7 +88,7 @@
   type: exitcode-stdio-1.0
   hs-source-dirs: src test/src
   main-is: TestMain.hs
-  ghc-options: -O2 -Wall -fhpc -fwarn-tabs -funbox-strict-fields -threaded
+  ghc-options: -O2 -Wall -fwarn-tabs -funbox-strict-fields -threaded
                -fno-warn-unused-do-bind -fno-warn-type-defaults
 
 
diff --git a/src/Shelly.hs b/src/Shelly.hs
--- a/src/Shelly.hs
+++ b/src/Shelly.hs
@@ -1070,14 +1070,16 @@
 -- | Like `run`, but it invokes the user-requested program with _bash_,
 -- setting _pipefail_ appropriately.
 bash :: FilePath -> [Text] -> Sh Text
-bash fp args = escaping False $ do
-  let sanitise = T.replace "'" "\'" . T.intercalate " "
-  run "bash" ["-c", "'set -o pipefail && " <> sanitise (toTextIgnore fp : args) <> "'"]
+bash fp args = escaping False $ run "bash" $ bashArgs fp args
 
 bash_ :: FilePath -> [Text] -> Sh ()
-bash_ fp args = escaping False $ do
-  let sanitise = T.replace "'" "\'" . T.intercalate " "
-  run_ "bash" ["-c", "'set -o pipefail && " <> sanitise (toTextIgnore fp : args) <> "'"]
+bash_ fp args = escaping False $ run_ "bash" $ bashArgs fp args
+
+bashArgs :: FilePath -> [Text] -> [Text]
+bashArgs fp args =
+  ["-c", "'set -o pipefail; " <> sanitise (toTextIgnore fp : args) <> "'"]
+  where
+    sanitise = T.replace "'" "\'" . T.intercalate " "
 
 -- | bind some arguments to run for re-use. Example:
 --
diff --git a/src/Shelly/Unix.hs b/src/Shelly/Unix.hs
new file mode 100644
--- /dev/null
+++ b/src/Shelly/Unix.hs
@@ -0,0 +1,12 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | commands that only work on Unix
+module Shelly.Unix
+  ( kill
+  ) where
+
+import Shelly
+import qualified Data.Text as T
+
+kill :: Int -> Sh ()
+kill pid = run_ "kill" ["-15", T.pack $ show pid]
