Safe Haskell | None |
---|---|
Language | Haskell98 |
A shell script monad
- data Script a
- script :: Script f -> Text
- linearScript :: Script f -> Text
- data Var
- val :: Var -> Quoted Text
- data Quoted a
- quote :: Text -> Quoted Text
- run :: Text -> [Text] -> Script ()
- cmd :: ShellCmd params => Text -> params
- class CmdArg a
- newtype Output = Output (Script ())
- newtype Val v = Val v
- comment :: Text -> Script ()
- newtype NamedLike = NamedLike Text
- class NameHinted h
- newVar :: NameHinted namehint => namehint -> Script Var
- newVarContaining :: NameHinted namehint => Text -> namehint -> Script Var
- globalVar :: Text -> Script Var
- positionalParameters :: Var
- takeParameter :: NameHinted namehint => namehint -> Script Var
- func :: (NameHinted namehint, ShellCmd callfunc) => namehint -> Script () -> Script callfunc
- (-|-) :: Script () -> Script () -> Script ()
- (-&&-) :: Script () -> Script () -> Script ()
- (-||-) :: Script () -> Script () -> Script ()
- forCmd :: Script () -> (Var -> Script ()) -> Script ()
- whileCmd :: Script () -> Script () -> Script ()
- ifCmd :: Script () -> Script () -> Script () -> Script ()
- whenCmd :: Script () -> Script () -> Script ()
- unlessCmd :: Script () -> Script () -> Script ()
- readVar :: Var -> Script ()
- stopOnFailure :: Bool -> Script ()
- ignoreFailure :: Script () -> Script ()
Documentation
script :: Script f -> Text Source
Generates a shell script, including hashbang, suitable to be written to a file.
linearScript :: Script f -> Text Source
Generates a single line of shell code.
A shell variable.
A value that is safely quoted.
quote :: Text -> Quoted Text Source
Quotes the value to allow it to be safely exposed to the shell.
The method used is to replace ' with '"'"' and wrap the value inside single quotes. This works for POSIX shells, as well as other shells like csh.
cmd :: ShellCmd params => Text -> params Source
Variadic argument version of run
.
The command can be passed any number of CmdArgs.
Convenient usage of cmd
requires the following:
{-# LANGUAGE OverloadedStrings, ExtendedDefaultRules #-} {-# OPTIONS_GHC -fno-warn-type-defaults #-} import Control.Monad.Shell import qualified Data.Text.Lazy as L default (L.Text)
This allows writing, for example:
demo = script $ do cmd "echo" "hello, world" name <- newVar "name" readVar name cmd "echo" "hello" name
toTextArg
CmdArg String | String arguments are automatically quoted. |
CmdArg Text | Text arguments are automatically quoted. |
CmdArg Output | Allows passing the output of a command as a parameter. |
CmdArg Var | Var arguments cause the (quoted) value of a shell variable to be passed to the command. |
Show v => CmdArg (Val v) | Any value that can be shown can be passed to |
CmdArg (Quoted Text) | Quoted Text arguments are passed as-is. |
The output of a command, or even a more complicated Script
can be passed as a parameter to cmd
Examples:
cmd "echo" "hello there," (Output (cmd "whoami")) cmd "echo" "root's pwent" (Output (cmd "cat" "/etc/passwd" -|- cmd "grep" "root"))
An arbitrary value.
Val v |
Suggests that a shell variable or function have its name contain the specified Text.
class NameHinted h Source
Class of values that provide a hint for the name to use for a shell variable or function.
To skip providing a hint, use '()'. To provide a hint, use '(NamedLike "name")'.
hinted
newVar :: NameHinted namehint => namehint -> Script Var Source
Defines a new shell variable.
Each call to newVar will generate a new, unique variable name.
The namehint can influence this name, but is modified to ensure uniqueness.
newVarContaining :: NameHinted namehint => Text -> namehint -> Script Var Source
Creates a new shell variable, with an initial value.
positionalParameters :: Var Source
This special Var expands to whatever parameters were passed to the shell script.
Inside a func, it expands to whatever parameters were passed to the func.
(This is $@
in shell)
takeParameter :: NameHinted namehint => namehint -> Script Var Source
Takes the first positional parameter, removing it from positionalParameters and returning a new Var that holds the value of the parameter.
If there are no more positional parameters, an error will be thrown at runtime.
For example:
removefirstfile = script $ do cmd "rm" =<< takeParameter cmd "echo" "remaining parameters:" positionalParameters
func :: (NameHinted namehint, ShellCmd callfunc) => namehint -> Script () -> Script callfunc Source
Defines a shell function, and returns an action that can be run to call the function.
The action is variadic; it can be passed any number of CmdArgs. Typically, it will make sense to specify a more concrete type when defining the shell function.
The shell function will be given a unique name, that is not used by any other shell function. The namehint can be used to influence the contents of the function name, which makes for more readable generated shell code.
For example:
demo = script $ do hohoho <- mkHohoho hohoho (Val 1) echo "And I heard him exclaim, ere he rode out of sight ..." hohoho (Val 3) mkHohoho :: Script (Val Int -> Script ()) mkHohoho = func (NamedLike "hohoho") $ do num <- takeParameter forCmd (cmd "seq" "1" num) $ \_n -> cmd "echo" "Ho, ho, ho!" "Merry xmas!"
forCmd :: Script () -> (Var -> Script ()) -> Script () Source
Runs the command, and separates its output into parts (using the IFS)
The action is run for each part, passed a Var containing the part.
whileCmd :: Script () -> Script () -> Script () Source
As long as the first Script exits nonzero, runs the second script.
ifCmd :: Script () -> Script () -> Script () -> Script () Source
if with a monadic conditional
If the conditional exits 0, the first action is run, else the second.
readVar :: Var -> Script () Source
Generates shell code to fill a variable with a line read from stdin.
stopOnFailure :: Bool -> Script () Source
By default, shell scripts continue running past commands that exit nonzero. Use "stopOnFailure True" to make the script stop on the first such command.
ignoreFailure :: Script () -> Script () Source
Makes a nonzero exit status be ignored.