summaryrefslogtreecommitdiff
path: root/man/1/mash
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2006-12-22 20:52:35 +0000
committerCharles.Forsyth <devnull@localhost>2006-12-22 20:52:35 +0000
commit46439007cf417cbd9ac8049bb4122c890097a0fa (patch)
tree6fdb25e5f3a2b6d5657eb23b35774b631d4d97e4 /man/1/mash
parent37da2899f40661e3e9631e497da8dc59b971cbd0 (diff)
20060303-partial
Diffstat (limited to 'man/1/mash')
-rw-r--r--man/1/mash635
1 files changed, 635 insertions, 0 deletions
diff --git a/man/1/mash b/man/1/mash
new file mode 100644
index 00000000..ed305553
--- /dev/null
+++ b/man/1/mash
@@ -0,0 +1,635 @@
+.TH MASH 1
+.SH NAME
+mash \- programmable shell
+.SH SYNOPSIS
+.B mash
+[
+.B -denx
+][
+.BI -c command
+] [
+.I file
+[
+.I arg ...
+]]
+.SH DESCRIPTION
+.I Mash
+is an older alternative to the original Inferno shell
+(now
+.IR tiny (1)).
+.I Mash
+is a programmable shell that also allows the definition of simple dependency
+rules, resembling those of Unix
+.IR make .
+It executes commands read from standard input
+or a file or, with the
+.B -c
+flag, from
+.IR mash 's
+argument list. Its syntax and
+semantics are similar to that of Plan 9's
+.IR rc .
+
+.SS Invocation
+If
+.I mash
+is started with no arguments it reads commands from standard
+input. Otherwise its first non-flag argument is the name of a file from
+which to read commands (but see
+.B -c
+below). Subsequent arguments
+become the initial value of
+.BR $args .
+Mash accepts the following
+command-line flags.
+.PD 0
+.TF "-c string"
+.TP
+.BI -c " string"
+Commands are read from string.
+.TP
+.B -d
+Dump parsed commands before execution.
+.TP
+.B -e
+Fail if a top level command does.
+.TP
+.B -n
+Parse but do not execute.
+.TP
+.B -x
+Print each simple command before executing it.
+.PD
+.PP
+If invoked without arguments
+.I mash
+first runs the commands found in
+.BR /lib/mashinit .
+
+.SS "Command Lines"
+Each command is terminated with an ampersand or a semicolon (& or ;).
+When reading from
+.B /dev/cons
+a newline
+not escaped with a backslash (\\) is treated as a semicolon.
+.I Mash
+does not
+wait for a command followed by
+.B &
+to finish executing before starting the
+following command.
+.PP
+A number-sign (#) and any following characters up to (but not including) the next newline are
+ignored, except in quotation marks.
+
+.SS "Simple Commands"
+A simple command is a sequence of words interspersed with I/O
+redirections. If the first word is the name of a
+.I mash
+function or of one of
+.IR mash 's
+built-in commands, it is executed by
+.IR mash .
+Otherwise, if the name
+starts with a slash
+.RB ( / ),
+it must be the path name of a Dis
+file to be loaded
+and executed. Names containing no initial slash are searched for in the
+current directory and then in
+.BR /dis .
+The
+.B .dis
+extension need not be
+supplied.
+.PP
+The keywords are
+.EX
+ case else fn for hd if in len rescue tl while
+.EE
+
+.SS Words and Variables
+A number of constructions may be used where
+.IR mash 's
+syntax requires a
+word to appear. In many cases a construction's value will be a list of
+strings rather than a single string.
+.PP
+The simplest kind of word is the unquoted word: a sequence of one or
+more characters none of which is a blank, tab, newline, or any of the
+following:
+.EX
+ # : ; ! ~ @ & | ^ $ = " ` ' { } ( ) < >
+.EE
+An unquoted word that contains any of the characters
+.BR * ,\ ?
+or
+.B [
+is a pattern
+for matching against file names. The character
+.B *
+matches any sequence of
+characters,
+.B ?
+matches any single character, and
+.B [
+.I class
+.B ]
+matches any
+character in the class. The class may also contain pairs of characters
+separated by
+.BR \- ,
+standing for all characters lexically between the two. The
+character
+.B /
+must appear explicitly in a pattern. A pattern is replaced by a
+list of words, one for each path name matched, except that a pattern
+matching no names is not replaced by the empty list, but rather stands for
+itself. Pattern matching is done after all other operations. Thus,
+.EX
+ x=/tmp; echo $x^/*.c;
+.EE
+matches
+.BR /tmp/*.c ,
+rather than matching
+.B /*.c
+and then prefixing
+.BR /tmp .
+.PP
+A quoted word is a sequence of characters surrounded by single quotes
+.RB ( ' ).
+A single quote is escaped with a backslash.
+.PP
+Each of the following is a word.
+.PD 0
+.HP
+.BI $ identifier
+.br
+The identifier after the
+.B $
+is the name of a variable whose value is
+substituted. Variable values are lists of strings. It is an error if the
+named variable has never been assigned a value.
+.HP
+.BI $ number
+.br
+See the description of rules for the
+.IR mash-make (1)
+builtin.
+.HP
+.B $"\c
+.I identifier
+.br
+The value is a single string containing the components of the named
+variable separated by spaces.
+.HP
+.BI `{ commands }
+.br
+.I mash
+executes the commands and reads the standard output, splitting
+it into a list of words, using the whitespace characters (space, tab,
+newline and carriage return) as separators.
+.HP
+.B
+"{\c
+.IB commands }
+.br
+.I mash
+executes the commands and reads the standard output, splitting
+it into a list of words, using the whitespace characters (space, tab,
+newline and carriage return) as separators.
+.HP
+.BI <{ commands }
+.HP
+.BI >{ commands }
+.br
+The commands are executed asynchronously with their standard
+output or standard input connected to a pipe. The value of the word
+is the name of a file referring to the other end of the pipe. This
+allows the construction of non-linear pipelines. For example, the
+following runs two commands
+.B old
+and
+.B new
+and uses
+.B cmp
+to compare their outputs
+.EX
+ cmp <{old} <{new};
+.EE
+.TP
+.BI ( expr )
+.I mash
+evaluates
+.I expr
+as an expression. The value is a (possibly null) list of words.
+Expressions are described in detail below.
+.HP
+.IB word ^ word
+.br
+The
+.B ^
+operator concatenates its two operands. If either operand is a
+singleton, the concatenation is distributive. Otherwise the lists are
+concatenated pairwise.
+
+.PD
+.SS Free Carets
+In most circumstances,
+.I mash
+will insert the
+.B ^
+operator automatically
+between words that are not separated by white space. Whenever one of
+.B $
+.BR ' or
+.B `
+(dollar, single quote or back quote)
+follows a quoted or unquoted word or an unquoted word follows a
+quoted word with no intervening blanks or tabs, a
+.B ^
+is inserted between
+the two. If an unquoted word immediately follows a
+.B $
+and contains a
+character other than an alphanumeric, or underscore, a
+.B ^
+is inserted before
+the first such character. Thus
+.IP
+.B limbo -$flags $stem.b
+.LP
+is equivalent to
+.IP
+.B limbo -^$flags $stem^.b
+
+.SS I/O Redirections
+The sequence
+.BI > file
+redirects the standard output file (file descriptor 1,
+normally
+.BR /dev/cons )
+to the named
+.IR file ;
+.BI >> file
+appends standard
+output to the file. The standard input file (file descriptor 0, also normally
+.BR /dev/cons )
+may be redirected from a file by the sequence
+.BR <file .
+The
+sequence
+.B <>file
+opens the file for read/write and associates both file
+descriptor 0 and 1 with it.
+
+.SH Compound Commands
+A pair of commands separated by a pipe operator
+.RB ( | )
+is a command. The
+standard output of the left command is sent through a pipe to the
+standard input of the right command.
+.PP
+Each of the following is a command.
+.PD 0
+.HP
+.B if (
+.I expr
+.B )
+.I command1
+.HP
+.B if (
+.I expr
+.B )
+.I command1
+.B else
+.I command2
+.br
+The
+.I expr
+ is evaluated and if the result is not null, then
+.I command1
+is executed. In the second form
+.I command2
+is executed if
+the result is null.
+.HP
+.B for (
+.I name
+.B in
+.I list
+.BI ) command
+.br
+The
+.I command
+is executed once for each word in
+.I list
+with that
+word assigned to
+.IR name .
+.HP
+.B while (
+.I expr
+.B )
+.I command
+.br
+The
+.I expr
+is evaluated repeatedly until its value is null. Each time it
+evaluates to non-null, the command is executed.
+.HP
+.B case
+.I expr
+.B {
+.I pattern-list
+.B =>
+.I command ...
+.B }
+.br
+.HP
+.B case
+.I expr-list
+.B {
+.I pattern
+.B =>
+.I command ...
+.B }
+.br
+In the first form of the command the
+.I expr
+is matched against a series of lists of regular expressions (See
+.IR regex (2)).
+The command associated with the matching expression is executed.
+In the second form the
+.I command
+associated with the first pattern to match one of the words in
+.I expr-list
+is executed. An
+.I expr-list
+will never match a
+.IR pattern-list .
+.HP
+.BI { commands }
+.HP
+.BI @{ commands }
+.br
+Braces serve to alter the grouping of commands implied by operator
+priorities. The body is a sequence of commands separated by
+.B &
+or
+.BR ; .
+The second form is executed with a new scope. Either form can be
+followed by redirections.
+.HP
+.BI fn name { list }
+.HP
+.BI fn name
+.br
+The first form defines a function with the given
+.IR name .
+Subsequently,
+whenever a command whose first word is
+.I name
+is encountered, the
+current value of the remainder of the command's word list will be
+assigned to the local variable
+.BR args ,
+in a new scope, and
+.I mash
+will execute the list. The second form removes
+.IR name 's
+function definition.
+.HP
+.IB name = list
+.HP
+.IB name := list
+.br
+The first form is an assignment to a variable. If the name is currently
+defined as a local variable its value will be updated. Otherwise a
+global variable with the given name will be defined or updated. The
+second form is an explicit definition or update of a local variable.
+.HP
+.IB list : list
+.HP
+.IB list : list { commands }
+.HP
+.IB word :~ word { commands }
+.br
+These forms define dependencies and rules for the
+.I make
+loadable
+builtin. The first form defines a simple dependency, the second a
+dependency with an explicit rule. The third form defines an implicit
+rule where the left-hand word is a file pattern, the right-hand word is
+the prerequisite. The right-hand word and the commands can
+contain references to the characters matched by the
+.B *
+meta-character
+in the pattern
+.RB ( $1
+evaluates to the characters matched by the first
+.BR * ,
+.B $2
+the second and so on;
+.B $0
+is the entire match).
+.PD
+
+.SS Expressions
+Expressions evaluate to possibly null lists of strings. A word is an
+expression. An expression may take one of the following forms
+.PD 0
+.HP
+.BI ( " expr " )
+.br
+Parentheses are used for grouping.
+.HP
+.BI hd " expr"
+.HP
+.BI tl " expr"
+.HP
+.BI len " expr"
+.HP
+.BI ! " expr"
+.br
+.I hd
+is the first element of a list,
+.I tl
+the remainder.
+.I len
+is the length of
+a list. Both evaluate to the null list if their operand is a null list.
+.B !
+is the not operator and evaluates to true for a null list or to a null list
+otherwise.
+.HP
+.IB expr " ^ " expr
+.HP
+.IB expr " :: " expr
+.HP
+.IB expr " == " expr
+.HP
+.IB expr " != " expr
+.HP
+.IB expr " ~ " expr
+.br
+.B ^
+is concatenation (as defined above),
+.B ::
+is list concatenation,
+.B ==
+and
+.B !=
+are the equality operators evaluating to true or the null list,
+depending on the equality or inequality of the two operands.
+.B ~
+is the match operator, true if a singleton string matches one of a list of
+regular expressions, or one of a list of strings matches a regular
+expression. (If neither operand is a singleton it evaluates to the null
+list.)
+.B ^
+has the highest precedence, followed by
+.B ::
+followed by the
+other three. All associate to the left except
+.BR :: .
+
+.SS Built-in Commands
+
+.I Mash
+supports loadable modules of builtins. The
+.I Mashbuiltin
+module definition and description is in
+.BR mash.m .
+One such module,
+.IR builtins ,
+is loaded before
+.I mash
+begins parsing. This module defines the following commands
+.PD 0
+.HP
+.B env
+.br
+Print global and local variables. Global variables are displayed using a
+.IB name = value
+format, and local variables using a
+.IB name := value
+format.
+.HP
+.B eval
+.br
+Concatenate arguments and use as mash input.
+.HP
+.B exit
+.br
+Cause
+.I mash
+to raise an
+.B "exit"
+exception.
+.HP
+.B load
+.I file
+.br
+Load a builtin module. The
+.I file
+must be a module with type
+.BR Mashbuiltin .
+The argument
+.I file
+is assumed to contain a path to the loadable module. If no such module
+is found then the string
+.B /dis/lib/mash/
+is prepended to
+.I file
+and the load is retried.
+.HP
+.B prompt
+.HP
+.BI prompt text
+.HP
+.BI prompt "text contin"
+.br
+When called with no arguments causes the current value of the
+.I mash
+prompt to be printed to standard output. The default value is
+.BR mash% .
+The second form sets a new prompt. The final form sets a new prompt
+and additionally a continuation string. Initially the continuation
+string is set to a single tab character.
+.I Mash
+uses the continuation string in place of the prompt string to indicate that
+the preceding line has been continued by escaping with a final backslash
+.RB ( \e )
+character.
+.HP
+.BI quote args...
+.br
+Print arguments quoted as input for
+.IR mash .
+.HP
+.BI "run -" [ denx "] file [arg...]"
+.br
+Interpret a file as input to
+.IR mash .
+.HP
+.BI time "cmd [arg...]"
+.br
+Time the execution of a command. The total execution time is reported
+in seconds and on standard error when the command completes.
+.HP
+.BI whatis name
+.br
+Print variable, function or builtin. The object given by
+.I name
+is described on standard output in a format that reflects its type.
+.PP
+The
+.I make
+loadable builtin provides `make` functionality.
+The
+.I tk
+loadable builtin provides control over some of the visual elements of a
+.I mash
+window.
+
+.SS Adding Builtins
+New builtins can be added to
+.I mash
+by creating a
+.I Dis
+module that can be loaded with a
+.B Mashbuiltin
+module interface (defined in mash.m).
+The new module is loaded with the builtin
+.B load
+command which calls its
+.B mashinit
+function to initialise it with an argument containing the
+.B load
+command line. The function should use this call to register the set of builtins
+that the module will provide using the
+.B Env.defbuiltin
+function. Thereafter, each time one of the registered builtins is invoked
+the module's
+.B mashcmd
+function is called passing as an argument a list containing the invoked
+builtin name and its arguments. See the examples in
+.BR mash/builtins.b ,
+.BR mash/make.b ", and"
+.BR mash/tk.b .
+.SH FILES
+.B /lib/mashinit
+.br
+.B /dis/lib/mash
+.SH SOURCE
+.B /appl/cmd/mash
+.SH SEE ALSO
+.IR mash-tk (1),
+.IR mash-make (1),
+.IR regex (2)
+.PP
+Tom Duff,
+``Rc \- The Plan 9 Shell'', in the
+.I "Plan 9 Programmer's Manual", Second Edition,
+Volume 2.