Documentation

    Syntax

    Usage patterns

    Text occurring between keyword usage: (case-insensitive) and a visibly empty line is interpreted as list of usage patterns. The first word after usage: is interpreted as the program’s name. Here is a minimal example for program that takes no command-line arguments:

    Usage: my_program
    

    Program can have several patterns listed with various elements used to describe the pattern:

      my_program command <argument>
      my_program [<optional-argument>]
      my_program (either-this-command | or-this-other-command)
      my_program <repeating-argument> <repeating-argument>...
    

    Each of the elements and constructs is described below. We will use the word word to describe a sequence of characters delimited by either whitespace, one of []()| characters, or ....

    ARGUMENT

    Words starting with “<”, ending with “>” and upper-case words are interpreted as positional arguments.

    Usage: my_program <host> <port>
    

    -o –option

    Words starting with one or two dashes (with exception of -, -- by themselves) are interpreted as short (one-letter) or long options, respectively.

    • Short options can be stacked meaning that -abc is equivalent to -a -b -c.
    • Long options can have arguments specified after space or equal = sign: --input=ARG is equivalent to --input ARG.
    • Short options can have arguments specified after optional space: -f FILE is equivalent to -fFILE.

    Note: writing --input ARG (as opposed to --input=ARG) is ambiguous, meaning it is not possible to tell whether ARG is option’s argument or a positional argument. In usage patterns this will be interpreted as an option with argument only if a description (covered below) for that option is provided. Otherwise it will be interpreted as an option and separate positional argument.

    There is the same ambiguity with the -f FILE and -fFILE notation. In the latter case it is not possible to tell whether it is a number of stacked short options, or an option with an argument. These notations will be interpreted as an option with argument only if a description for the option is provided.

    Warning: options should be passed to rash after -- to be interpreted as script arguments. Other way it is to use them after another non option arg.

    [optional elements]

    Elements (arguments, commands) enclosed with square brackets [] are marked to be optional. It does not matter if elements are enclosed in the same or different pairs of brackets.

    E.g.:

    Usage: my_program [command <argument>]
    
    Usage: my_program [command] [<argument>]
    

    (required elements)

    All elements are required by default, if not included in brackets []. However, sometimes it is necessary to mark elements as required explicitly with parentheses (). For example, when you need to group mutually-exclusive elements (see next section):

    Usage: my_program (--either-this <and-that> | <or-this>)
    

    Another use case is when you need to specify that if one element is present, then another one is required, which you can achieve as:

    Usage: my_program [(<one-argument> <another-argument>)]
    

    In this case, a valid program invocation could be with either no arguments, or with 2 arguments.

    element|another

    Mutually-exclusive elements can be separated with a pipe | as follows:

    Usage: my_program go (up | down | left | right)
    

    Use parentheses () to group elements when one of the mutually exclusive cases is required. Use brackets [] to group elements when none of the mutually exclusive cases is required:

    Usage: my_program go [up | down | left | right]
    
    Note, that specifying several patterns works exactly like pipe “ ”, that is:
    Usage: my_program run [fast]
           my_program jump [high]
    

    is equivalent to:

    Usage: my_program (run [fast] | jump [high])
    

    element…

    Use ellipsis ... to specify that the argument (or group of arguments) to the left could be repeated one or more times:

    Usage: my_program open <file>...
           my_program move (<from> <to>)...
    

    You can flexibly specify the number of arguments that are required. Here are 3 (redundant) ways of requiring zero or more arguments:

    Usage: my_program [<file>...]
           my_program [<file>]...
           my_program [<file> [<file> ...]]
    

    One or more arguments:

    Usage: my_program <file>...
    

    Two or more arguments (and so on):

    Usage: my_program <file> <file>...