diff --git a/handsy.cabal b/handsy.cabal
--- a/handsy.cabal
+++ b/handsy.cabal
@@ -1,5 +1,5 @@
 name:          handsy
-version:       0.0.5
+version:       0.0.6
 synopsis:      A DSL to describe common shell operations and interpeters for running them locally and remotely.
 -- description:   
 Homepage:      https://github.com/utdemir/handsy
diff --git a/src/System/Handsy.hs b/src/System/Handsy.hs
--- a/src/System/Handsy.hs
+++ b/src/System/Handsy.hs
@@ -1,9 +1,11 @@
+{-# LANGUAGE LambdaCase        #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module System.Handsy where
 
 import           Control.Monad.IO.Class
 import qualified Data.ByteString.Lazy           as B
+import qualified Data.ByteString.Lazy.Char8     as C
 import           System.Exit
 
 import           Control.Monad.Free.TH
@@ -46,6 +48,20 @@
       -> B.ByteString -- ^ Standart input
       -> Handsy (ExitCode, B.ByteString, B.ByteString) -- ^ (ExitCode, Stdout, Stderr)
 shell cmd stdin = command "/usr/bin/env" ["sh", "-c", cmd] stdin
+
+-- | Same as 'shell', but ExitFailure is a runtime error.
+shell_ :: String  -> B.ByteString -> Handsy (B.ByteString, B.ByteString)
+shell_ cmd stdin = shell cmd stdin >>= \case
+  (ExitFailure code, _, stderr) -> error ('`':cmd ++ "` returned " ++ show code
+                                       ++ "\nStderr was: " ++ (C.unpack stderr))
+  (ExitSuccess, stdout, stderr) -> return (stdout, stderr)
+
+-- | Same as 'command', but ExitFailure is a runtime error.
+command_ :: FilePath -> [String] -> B.ByteString -> Handsy (B.ByteString, B.ByteString)
+command_ path args stdin = command path args stdin >>= \case
+  (ExitFailure code, _, stderr) -> error ('`':path ++ ' ' :(show args) ++ "` returned " ++ show code
+                                       ++ "\nStderr was: " ++ (C.unpack stderr))
+  (ExitSuccess, stdout, stderr) -> return (stdout, stderr)
 
 -- * Interpreter
 
