summaryrefslogtreecommitdiff
path: root/assets/info/zsh.info-1
diff options
context:
space:
mode:
Diffstat (limited to 'assets/info/zsh.info-1')
-rw-r--r--assets/info/zsh.info-17487
1 files changed, 7487 insertions, 0 deletions
diff --git a/assets/info/zsh.info-1 b/assets/info/zsh.info-1
new file mode 100644
index 00000000..cb22a64e
--- /dev/null
+++ b/assets/info/zsh.info-1
@@ -0,0 +1,7487 @@
+This is zsh.info, produced by makeinfo version 4.8 from ./zsh.texi.
+
+INFO-DIR-SECTION Utilities
+START-INFO-DIR-ENTRY
+* ZSH: (zsh). The Z Shell Manual.
+END-INFO-DIR-ENTRY
+
+
+File: zsh.info, Node: Top, Next: The Z Shell Manual, Prev: (dir), Up: (dir)
+
+The Z Shell Manual
+******************
+
+ This Info file documents Zsh, a freely available UNIX command
+interpreter (shell), which of the standard shells most closely
+resembles the Korn shell (ksh), although it is not completely
+compatible. Zsh is able to emulate POSIX shells, but its default mode
+is not POSIX compatible, either.
+
+Version 5.8.1, last updated February 12, 2022.
+
+* Menu:
+
+* The Z Shell Manual::
+* Introduction::
+* Roadmap::
+* Invocation::
+* Files::
+* Shell Grammar::
+* Redirection::
+* Command Execution::
+* Functions::
+* Jobs & Signals::
+* Arithmetic Evaluation::
+* Conditional Expressions::
+* Prompt Expansion::
+* Expansion::
+* Parameters::
+* Options::
+* Shell Builtin Commands::
+* Zsh Line Editor::
+* Completion Widgets::
+* Completion System::
+* Completion Using compctl::
+* Zsh Modules::
+* Calendar Function System::
+* TCP Function System::
+* Zftp Function System::
+* User Contributions::
+
+--- Indices ---
+
+* Concept Index::
+* Variables Index::
+* Options Index::
+* Functions Index::
+* Editor Functions Index::
+* Style and Tag Index::
+
+--- The Detailed Node Listing ---
+
+Introduction
+
+* Author::
+* Availability::
+* Mailing Lists::
+* The Zsh FAQ::
+* The Zsh Web Page::
+* The Zsh Userguide::
+* See Also::
+
+Invocation
+
+* Compatibility::
+* Restricted Shell::
+
+Shell Grammar
+
+* Simple Commands & Pipelines::
+* Precommand Modifiers::
+* Complex Commands::
+* Alternate Forms For Complex Commands::
+* Reserved Words::
+* Comments::
+* Aliasing::
+* Quoting::
+
+Expansion
+
+* History Expansion::
+* Process Substitution::
+* Parameter Expansion::
+* Command Substitution::
+* Arithmetic Expansion::
+* Brace Expansion::
+* Filename Expansion::
+* Filename Generation::
+
+Parameters
+
+* Array Parameters::
+* Positional Parameters::
+* Local Parameters::
+* Parameters Set By The Shell::
+* Parameters Used By The Shell::
+
+Options
+
+* Specifying Options::
+* Description of Options::
+* Option Aliases::
+* Single Letter Options::
+
+Zsh Line Editor
+
+* Keymaps::
+* Zle Builtins::
+* Zle Widgets::
+* Character Highlighting::
+
+Completion Widgets
+
+* Completion Special Parameters::
+* Completion Builtin Commands::
+* Completion Condition Codes::
+* Completion Matching Control::
+* Completion Widget Example::
+
+Completion System
+
+* Initialization::
+* Completion System Configuration::
+* Control Functions::
+* Bindable Commands::
+* Completion Functions::
+* Completion Directories::
+
+Completion Using compctl
+
+* Command Flags::
+* Option Flags::
+* Alternative Completion::
+* Extended Completion::
+* Example::
+
+Zsh Modules
+
+* The zsh/attr Module::
+* The zsh/cap Module::
+* The zsh/clone Module::
+* The zsh/compctl Module::
+* The zsh/complete Module::
+* The zsh/complist Module::
+* The zsh/computil Module::
+* The zsh/curses Module::
+* The zsh/datetime Module::
+* The zsh/db/gdbm Module::
+* The zsh/deltochar Module::
+* The zsh/example Module::
+* The zsh/files Module::
+* The zsh/langinfo Module::
+* The zsh/mapfile Module::
+* The zsh/mathfunc Module::
+* The zsh/nearcolor Module::
+* The zsh/newuser Module::
+* The zsh/parameter Module::
+* The zsh/pcre Module::
+* The zsh/param/private Module::
+* The zsh/regex Module::
+* The zsh/sched Module::
+* The zsh/net/socket Module::
+* The zsh/stat Module::
+* The zsh/system Module::
+* The zsh/net/tcp Module::
+* The zsh/termcap Module::
+* The zsh/terminfo Module::
+* The zsh/zftp Module::
+* The zsh/zle Module::
+* The zsh/zleparameter Module::
+* The zsh/zprof Module::
+* The zsh/zpty Module::
+* The zsh/zselect Module::
+* The zsh/zutil Module::
+
+Calendar Function System
+
+* Calendar File and Date Formats::
+* Calendar System User Functions::
+* Calendar Styles::
+* Calendar Utility Functions::
+* Calendar Bugs::
+
+TCP Function System
+
+* TCP Functions::
+* TCP Parameters::
+* TCP Examples::
+* TCP Bugs::
+
+Zftp Function System
+
+* Installation::
+* Zftp Functions::
+* Miscellaneous Features::
+
+User Contributions
+
+* Utilities::
+* Recent Directories::
+* Other Directory Functions::
+* Version Control Information::
+* Prompt Themes::
+* ZLE Functions::
+* Exception Handling::
+* MIME Functions::
+* Mathematical Functions::
+* User Configuration Functions::
+* Other Functions::
+
+
+File: zsh.info, Node: The Z Shell Manual, Next: Introduction, Prev: Top, Up: Top
+
+1 The Z Shell Manual
+********************
+
+This document has been produced from the texinfo file zsh.texi,
+included in the Doc sub-directory of the Zsh distribution.
+
+1.1 Producing documentation from zsh.texi
+=========================================
+
+The texinfo source may be converted into several formats:
+
+
+The Info manual
+ The Info format allows searching for topics, commands, functions,
+ etc. from the many Indices. The command `makeinfo zsh.texi' is
+ used to produce the Info documentation.
+
+The printed manual
+ The command `texi2dvi zsh.texi' will output zsh.dvi which can then
+ be processed with `dvips' and optionally `gs' (Ghostscript) to
+ produce a nicely formatted printed manual.
+
+The HTML manual
+ An HTML version of this manual is available at the Zsh web site
+ via:
+
+ `http://zsh.sourceforge.net/Doc/'.
+
+ (The HTML version is produced with `texi2html', which may be
+ obtained from `http://www.nongnu.org/texi2html/'. The command is
+ `texi2html -output . -ifinfo -split=chapter -node-files zsh.texi'.
+ If necessary, upgrade to version 1.78 of texi2html.)
+
+
+For those who do not have the necessary tools to process texinfo,
+precompiled documentation (PostScript, dvi, PDF, info and HTML formats)
+is available from the zsh archive site or its mirrors, in the file
+zsh-doc.tar.gz. (See *Note Availability:: for a list of sites.)
+
+
+File: zsh.info, Node: Introduction, Next: Roadmap, Prev: The Z Shell Manual, Up: Top
+
+2 Introduction
+**************
+
+Zsh is a UNIX command interpreter (shell) usable as an interactive
+login shell and as a shell script command processor. Of the standard
+shells, zsh most closely resembles `ksh' but includes many
+enhancements. It does not provide compatibility with POSIX or other
+shells in its default operating mode: see the section *Note
+Compatibility::.
+
+Zsh has command line editing, builtin spelling correction, programmable
+command completion, shell functions (with autoloading), a history
+mechanism, and a host of other features.
+
+* Menu:
+
+* Author::
+* Availability::
+* Mailing Lists::
+* The Zsh FAQ::
+* The Zsh Web Page::
+* The Zsh Userguide::
+* See Also::
+
+
+File: zsh.info, Node: Author, Next: Availability, Up: Introduction
+
+2.1 Author
+==========
+
+Zsh was originally written by Paul Falstad <pf@zsh.org>. Zsh is now
+maintained by the members of the zsh-workers mailing list
+<zsh-workers@zsh.org>. The development is currently coordinated by
+Peter Stephenson <pws@zsh.org>. The coordinator can be contacted at
+<coordinator@zsh.org>, but matters relating to the code should
+generally go to the mailing list.
+
+
+File: zsh.info, Node: Availability, Next: Mailing Lists, Prev: Author, Up: Introduction
+
+2.2 Availability
+================
+
+Zsh is available from the following HTTP and anonymous FTP site.
+
+`ftp://ftp.zsh.org/pub/'
+`https://www.zsh.org/pub/' )
+
+The up-to-date source code is available via Git from Sourceforge. See
+`https://sourceforge.net/projects/zsh/' for details. A summary of
+instructions for the archive can be found at
+`http://zsh.sourceforge.net/'.
+
+
+
+
+File: zsh.info, Node: Mailing Lists, Next: The Zsh FAQ, Prev: Availability, Up: Introduction
+
+2.3 Mailing Lists
+=================
+
+Zsh has 3 mailing lists:
+
+
+<zsh-announce@zsh.org>
+ Announcements about releases, major changes in the shell and the
+ monthly posting of the Zsh FAQ. (moderated)
+
+<zsh-users@zsh.org>
+ User discussions.
+
+<zsh-workers@zsh.org>
+ Hacking, development, bug reports and patches.
+
+
+To subscribe or unsubscribe, send mail to the associated administrative
+address for the mailing list.
+
+
+<zsh-announce-subscribe@zsh.org>
+
+<zsh-users-subscribe@zsh.org>
+
+<zsh-workers-subscribe@zsh.org>
+
+
+<zsh-announce-unsubscribe@zsh.org>
+
+<zsh-users-unsubscribe@zsh.org>
+
+<zsh-workers-unsubscribe@zsh.org>
+
+
+YOU ONLY NEED TO JOIN ONE OF THE MAILING LISTS AS THEY ARE NESTED. All
+submissions to `zsh-announce' are automatically forwarded to
+`zsh-users'. All submissions to `zsh-users' are automatically
+forwarded to `zsh-workers'.
+
+If you have problems subscribing/unsubscribing to any of the mailing
+lists, send mail to <listmaster@zsh.org>. The mailing lists are
+maintained by Karsten Thygesen <karthy@kom.auc.dk>.
+
+The mailing lists are archived; the archives can be accessed via the
+administrative addresses listed above. There is also a hypertext
+archive, maintained by Geoff Wing <gcw@zsh.org>, available at
+`https://www.zsh.org/mla/'.
+
+
+File: zsh.info, Node: The Zsh FAQ, Next: The Zsh Web Page, Prev: Mailing Lists, Up: Introduction
+
+2.4 The Zsh FAQ
+===============
+
+Zsh has a list of Frequently Asked Questions (FAQ), maintained by Peter
+Stephenson <pws@zsh.org>. It is regularly posted to the newsgroup
+`comp.unix.shell' and the `zsh-announce' mailing list. The latest
+version can be found at any of the Zsh FTP sites, or at
+`http://www.zsh.org/FAQ/'. The contact address for FAQ-related matters
+is <faqmaster@zsh.org>.
+
+
+File: zsh.info, Node: The Zsh Web Page, Next: The Zsh Userguide, Prev: The Zsh FAQ, Up: Introduction
+
+2.5 The Zsh Web Page
+====================
+
+Zsh has a web page which is located at `https://www.zsh.org/'. This is
+maintained by Karsten Thygesen <karthy@zsh.org>, of SunSITE Denmark.
+The contact address for web-related matters is <webmaster@zsh.org>.
+
+
+File: zsh.info, Node: The Zsh Userguide, Next: See Also, Prev: The Zsh Web Page, Up: Introduction
+
+2.6 The Zsh Userguide
+=====================
+
+A userguide is currently in preparation. It is intended to complement
+the manual, with explanations and hints on issues where the manual can
+be cabbalistic, hierographic, or downright mystifying (for example, the
+word `hierographic' does not exist). It can be viewed in its current
+state at `http://zsh.sourceforge.net/Guide/'. At the time of writing,
+chapters dealing with startup files and their contents and the new
+completion system were essentially complete.
+
+
+File: zsh.info, Node: See Also, Prev: The Zsh Userguide, Up: Introduction
+
+2.7 See Also
+============
+
+man page sh(1), man page csh(1), man page tcsh(1), man page rc(1), man
+page bash(1), man page ksh(1)
+
+`IEEE Standard for information Technology - Portable Operating System
+Interface (POSIX) - Part 2: Shell and Utilities', IEEE Inc, 1993, ISBN
+1-55937-255-9.
+
+
+File: zsh.info, Node: Roadmap, Next: Invocation, Prev: Introduction, Up: Top
+
+3 Roadmap
+*********
+
+The Zsh Manual, like the shell itself, is large and often complicated.
+This section of the manual provides some pointers to areas of the shell
+that are likely to be of particular interest to new users, and indicates
+where in the rest of the manual the documentation is to be found.
+
+
+
+3.1 When the shell starts
+=========================
+
+When it starts, the shell reads commands from various files. These can
+be created or edited to customize the shell. See *Note Files::.
+
+If no personal initialization files exist for the current user, a
+function is run to help you change some of the most common settings.
+It won't appear if your administrator has disabled the zsh/newuser
+module. The function is designed to be self-explanatory. You can run
+it by hand with `autoload -Uz zsh-newuser-install; zsh-newuser-install
+-f'. See also *Note User Configuration Functions::.
+
+
+
+3.2 Interactive Use
+===================
+
+Interaction with the shell uses the builtin Zsh Line Editor, ZLE. This
+is described in detail in *Note Zsh Line Editor::.
+
+The first decision a user must make is whether to use the Emacs or Vi
+editing mode as the keys for editing are substantially different. Emacs
+editing mode is probably more natural for beginners and can be selected
+explicitly with the command bindkey -e.
+
+A history mechanism for retrieving previously typed lines (most simply
+with the Up or Down arrow keys) is available; note that, unlike other
+shells, zsh will not save these lines when the shell exits unless you
+set appropriate variables, and the number of history lines retained by
+default is quite small (30 lines). See the description of the shell
+variables (referred to in the documentation as parameters) HISTFILE,
+HISTSIZE and SAVEHIST in *Note Parameters Used By The Shell::. Note
+that it's currently only possible to read and write files saving history
+when the shell is interactive, i.e. it does not work from scripts.
+
+The shell now supports the UTF-8 character set (and also others if
+supported by the operating system). This is (mostly) handled
+transparently by the shell, but the degree of support in terminal
+emulators is variable. There is some discussion of this in the shell
+FAQ, `http://www.zsh.org/FAQ/'. Note in particular that for combining
+characters to be handled the option COMBINING_CHARS needs to be set.
+Because the shell is now more sensitive to the definition of the
+character set, note that if you are upgrading from an older version of
+the shell you should ensure that the appropriate variable, either LANG
+(to affect all aspects of the shell's operation) or LC_CTYPE (to affect
+only the handling of character sets) is set to an appropriate value.
+This is true even if you are using a single-byte character set
+including extensions of ASCII such as ISO-8859-1 or ISO-8859-15. See
+the description of LC_CTYPE in *Note Parameters::.
+
+
+
+3.2.1 Completion
+----------------
+
+Completion is a feature present in many shells. It allows the user to
+type only a part (usually the prefix) of a word and have the shell fill
+in the rest. The completion system in zsh is programmable. For
+example, the shell can be set to complete email addresses in arguments
+to the mail command from your ~/.abook/addressbook; usernames,
+hostnames, and even remote paths in arguments to scp, and so on.
+Anything that can be written in or glued together with zsh can be the
+source of what the line editor offers as possible completions.
+
+Zsh has two completion systems, an old, so called compctl completion
+(named after the builtin command that serves as its complete and only
+user interface), and a new one, referred to as compsys, organized as
+library of builtin and user-defined functions. The two systems differ
+in their interface for specifying the completion behavior. The new
+system is more customizable and is supplied with completions for many
+commonly used commands; it is therefore to be preferred.
+
+The completion system must be enabled explicitly when the shell starts.
+For more information see *Note Completion System::.
+
+
+
+3.2.2 Extending the line editor
+-------------------------------
+
+Apart from completion, the line editor is highly extensible by means of
+shell functions. Some useful functions are provided with the shell;
+they provide facilities such as:
+
+
+insert-composed-char
+ composing characters not found on the keyboard
+
+match-words-by-style
+ configuring what the line editor considers a word when moving or
+ deleting by word
+
+history-beginning-search-backward-end, etc.
+ alternative ways of searching the shell history
+
+replace-string, replace-pattern
+ functions for replacing strings or patterns globally in the
+ command line
+
+edit-command-line
+ edit the command line with an external editor.
+
+
+See *Note ZLE Functions:: for descriptions of these.
+
+
+
+3.3 Options
+===========
+
+The shell has a large number of options for changing its behaviour.
+These cover all aspects of the shell; browsing the full documentation is
+the only good way to become acquainted with the many possibilities. See
+*Note Options::.
+
+
+
+3.4 Pattern Matching
+====================
+
+The shell has a rich set of patterns which are available for file
+matching (described in the documentation as `filename generation' and
+also known for historical reasons as `globbing') and for use when
+programming. These are described in *Note Filename Generation::.
+
+Of particular interest are the following patterns that are not commonly
+supported by other systems of pattern matching:
+
+
+**
+ for matching over multiple directories
+
+|
+ for matching either of two alternatives
+
+~, ^
+ the ability to exclude patterns from matching when the
+ EXTENDED_GLOB option is set
+
+(...)
+ glob qualifiers, included in parentheses at the end of the pattern,
+ which select files by type (such as directories) or attribute
+ (such as size).
+
+
+
+3.5 General Comments on Syntax
+==============================
+
+Although the syntax of zsh is in ways similar to the Korn shell, and
+therefore more remotely to the original UNIX shell, the Bourne shell,
+its default behaviour does not entirely correspond to those shells.
+General shell syntax is introduced in *Note Shell Grammar::.
+
+One commonly encountered difference is that variables substituted onto
+the command line are not split into words. See the description of the
+shell option SH_WORD_SPLIT in *Note Parameter Expansion::. In zsh, you
+can either explicitly request the splitting (e.g. ${=foo}) or use an
+array when you want a variable to expand to more than one word. See
+*Note Array Parameters::.
+
+
+
+3.6 Programming
+===============
+
+The most convenient way of adding enhancements to the shell is typically
+by writing a shell function and arranging for it to be autoloaded.
+Functions are described in *Note Functions::. Users changing from the
+C shell and its relatives should notice that aliases are less used in
+zsh as they don't perform argument substitution, only simple text
+replacement.
+
+A few general functions, other than those for the line editor described
+above, are provided with the shell and are described in *Note User
+Contributions::. Features include:
+
+
+promptinit
+ a prompt theme system for changing prompts easily, see *Note
+ Prompt Themes::
+
+zsh-mime-setup
+ a MIME-handling system which dispatches commands according to the
+ suffix of a file as done by graphical file managers
+
+zcalc
+ a calculator
+
+zargs
+ a version of xargs that makes the find command redundant
+
+zmv
+ a command for renaming files by means of shell patterns.
+
+
+
+File: zsh.info, Node: Invocation, Next: Files, Prev: Roadmap, Up: Top
+
+4 Invocation
+************
+
+
+
+4.1 Invocation
+==============
+
+The following flags are interpreted by the shell when invoked to
+determine where the shell will read commands from:
+
+
+-c
+ Take the first argument as a command to execute, rather than
+ reading commands from a script or standard input. If any further
+ arguments are given, the first one is assigned to $0, rather than
+ being used as a positional parameter.
+
+-i
+ Force shell to be interactive. It is still possible to specify a
+ script to execute.
+
+-s
+ Force shell to read commands from the standard input. If the -s
+ flag is not present and an argument is given, the first argument
+ is taken to be the pathname of a script to execute.
+
+
+If there are any remaining arguments after option processing, and
+neither of the options -c or -s was supplied, the first argument is
+taken as the file name of a script containing shell commands to be
+executed. If the option PATH_SCRIPT is set, and the file name does not
+contain a directory path (i.e. there is no `/' in the name), first the
+current directory and then the command path given by the variable PATH
+are searched for the script. If the option is not set or the file name
+contains a `/' it is used directly.
+
+After the first one or two arguments have been appropriated as
+described above, the remaining arguments are assigned to the positional
+parameters.
+
+For further options, which are common to invocation and the set
+builtin, see *Note Options::.
+
+The long option `--emulate' followed (in a separate word) by an
+emulation mode may be passed to the shell. The emulation modes are
+those described for the emulate builtin, see *Note Shell Builtin
+Commands::. The `--emulate' option must precede any other options
+(which might otherwise be overridden), but following options are
+honoured, so may be used to modify the requested emulation mode. Note
+that certain extra steps are taken to ensure a smooth emulation when
+this option is used compared with the emulate command within the shell:
+for example, variables that conflict with POSIX usage such as path are
+not defined within the shell.
+
+Options may be specified by name using the -o option. -o acts like a
+single-letter option, but takes a following string as the option name.
+For example,
+
+
+ zsh -x -o shwordsplit scr
+
+runs the script scr, setting the XTRACE option by the corresponding
+letter `-x' and the SH_WORD_SPLIT option by name. Options may be
+turned _off_ by name by using +o instead of -o. -o can be stacked up
+with preceding single-letter options, so for example `-xo shwordsplit'
+or `-xoshwordsplit' is equivalent to `-x -o shwordsplit'.
+
+Options may also be specified by name in GNU long option style,
+`--OPTION-NAME'. When this is done, `-' characters in the option name
+are permitted: they are translated into `_', and thus ignored. So, for
+example, `zsh --sh-word-split' invokes zsh with the SH_WORD_SPLIT
+option turned on. Like other option syntaxes, options can be turned
+off by replacing the initial `-' with a `+'; thus `+-sh-word-split' is
+equivalent to `--no-sh-word-split'. Unlike other option syntaxes,
+GNU-style long options cannot be stacked with any other options, so for
+example `-x-shwordsplit' is an error, rather than being treated like
+`-x --shwordsplit'.
+
+The special GNU-style option `--version' is handled; it sends to
+standard output the shell's version information, then exits
+successfully. `--help' is also handled; it sends to standard output a
+list of options that can be used when invoking the shell, then exits
+successfully.
+
+Option processing may be finished, allowing following arguments that
+start with `-' or `+' to be treated as normal arguments, in two ways.
+Firstly, a lone `-' (or `+') as an argument by itself ends option
+processing. Secondly, a special option `--' (or `+-'), which may be
+specified on its own (which is the standard POSIX usage) or may be
+stacked with preceding options (so `-x-' is equivalent to `-x --').
+Options are not permitted to be stacked after `--' (so `-x-f' is an
+error), but note the GNU-style option form discussed above, where
+`--shwordsplit' is permitted and does not end option processing.
+
+Except when the `sh'/`ksh' emulation single-letter options are in
+effect, the option `-b' (or `+b') ends option processing. `-b' is like
+`--', except that further single-letter options can be stacked after
+the `-b' and will take effect as normal.
+
+
+
+* Menu:
+
+* Compatibility::
+* Restricted Shell::
+
+
+
+File: zsh.info, Node: Compatibility, Next: Restricted Shell, Up: Invocation
+
+4.2 Compatibility
+=================
+
+Zsh tries to emulate `sh' or `ksh' when it is invoked as sh or ksh
+respectively; more precisely, it looks at the first letter of the name
+by which it was invoked, excluding any initial `r' (assumed to stand
+for `restricted'), and if that is `b', `s' or `k' it will emulate `sh'
+or `ksh'. Furthermore, if invoked as su (which happens on certain
+systems when the shell is executed by the su command), the shell will
+try to find an alternative name from the SHELL environment variable and
+perform emulation based on that.
+
+In `sh' and `ksh' compatibility modes the following parameters are not
+special and not initialized by the shell: ARGC, argv, cdpath, fignore,
+fpath, HISTCHARS, mailpath, MANPATH, manpath, path, prompt, PROMPT,
+PROMPT2, PROMPT3, PROMPT4, psvar, status, watch.
+
+The usual zsh startup/shutdown scripts are not executed. Login shells
+source /etc/profile followed by $HOME/.profile. If the ENV environment
+variable is set on invocation, $ENV is sourced after the profile
+scripts. The value of ENV is subjected to parameter expansion, command
+substitution, and arithmetic expansion before being interpreted as a
+pathname. Note that the PRIVILEGED option also affects the execution
+of startup files.
+
+The following options are set if the shell is invoked as sh or ksh:
+NO_BAD_PATTERN, NO_BANG_HIST, NO_BG_NICE, NO_EQUALS,
+NO_FUNCTION_ARGZERO, GLOB_SUBST, NO_GLOBAL_EXPORT, NO_HUP,
+INTERACTIVE_COMMENTS, KSH_ARRAYS, NO_MULTIOS, NO_NOMATCH, NO_NOTIFY,
+POSIX_BUILTINS, NO_PROMPT_PERCENT, RM_STAR_SILENT, SH_FILE_EXPANSION,
+SH_GLOB, SH_OPTION_LETTERS, SH_WORD_SPLIT. Additionally the BSD_ECHO
+and IGNORE_BRACES options are set if zsh is invoked as sh. Also, the
+KSH_OPTION_PRINT, LOCAL_OPTIONS, PROMPT_BANG, PROMPT_SUBST and
+SINGLE_LINE_ZLE options are set if zsh is invoked as ksh.
+
+
+File: zsh.info, Node: Restricted Shell, Prev: Compatibility, Up: Invocation
+
+4.3 Restricted Shell
+====================
+
+When the basename of the command used to invoke zsh starts with the
+letter `r' or the `-r' command line option is supplied at invocation,
+the shell becomes restricted. Emulation mode is determined after
+stripping the letter `r' from the invocation name. The following are
+disabled in restricted mode:
+
+
+ * changing directories with the cd builtin
+
+ * changing or unsetting the EGID, EUID, GID, HISTFILE, HISTSIZE,
+ IFS, LD_AOUT_LIBRARY_PATH, LD_AOUT_PRELOAD, LD_LIBRARY_PATH,
+ LD_PRELOAD, MODULE_PATH, module_path, PATH, path, SHELL, UID and
+ USERNAME parameters
+
+ * specifying command names containing /
+
+ * specifying command pathnames using hash
+
+ * redirecting output to files
+
+ * using the exec builtin command to replace the shell with another
+ command
+
+ * using jobs -Z to overwrite the shell process' argument and
+ environment space
+
+ * using the ARGV0 parameter to override argv[0] for external commands
+
+ * turning off restricted mode with set +r or unsetopt RESTRICTED
+
+These restrictions are enforced after processing the startup files. The
+startup files should set up PATH to point to a directory of commands
+which can be safely invoked in the restricted environment. They may
+also add further restrictions by disabling selected builtins.
+
+Restricted mode can also be activated any time by setting the
+RESTRICTED option. This immediately enables all the restrictions
+described above even if the shell still has not processed all startup
+files.
+
+A shell _Restricted Mode_ is an outdated way to restrict what users may
+do: modern systems have better, safer and more reliable ways to
+confine user actions, such as _chroot jails_, _containers_ and _zones_.
+
+A restricted shell is very difficult to implement safely. The feature
+may be removed in a future version of zsh.
+
+It is important to realise that the restrictions only apply to the
+shell, not to the commands it runs (except for some shell builtins).
+While a restricted shell can only run the restricted list of commands
+accessible via the predefined `PATH' variable, it does not prevent those
+commands from running any other command.
+
+As an example, if `env' is among the list of _allowed_ commands, then
+it allows the user to run any command as `env' is not a shell builtin
+command and can run arbitrary executables.
+
+So when implementing a restricted shell framework it is important to be
+fully aware of what actions each of the _allowed_ commands or features
+(which may be regarded as _modules_) can perform.
+
+Many commands can have their behaviour affected by environment
+variables. Except for the few listed above, zsh does not restrict the
+setting of environment variables.
+
+If a `perl', `python', `bash', or other general purpose interpreted
+script it treated as a restricted command, the user can work around the
+restriction by setting specially crafted `PERL5LIB', `PYTHONPATH',
+`BASHENV' (etc.) environment variables. On GNU systems, any command can
+be made to run arbitrary code when performing character set conversion
+(including zsh itself) by setting a `GCONV_PATH' environment variable.
+Those are only a few examples.
+
+Bear in mind that, contrary to some other shells, `readonly' is not a
+security feature in zsh as it can be undone and so cannot be used to
+mitigate the above.
+
+A restricted shell only works if the allowed commands are few and
+carefully written so as not to grant more access to users than
+intended. It is also important to restrict what zsh module the user may
+load as some of them, such as `zsh/system', `zsh/mapfile' and
+`zsh/files', allow bypassing most of the restrictions.
+
+
+File: zsh.info, Node: Files, Next: Shell Grammar, Prev: Invocation, Up: Top
+
+5 Files
+*******
+
+
+
+5.1 Startup/Shutdown Files
+==========================
+
+Commands are first read from /etc/zshenv; this cannot be overridden.
+Subsequent behaviour is modified by the RCS and GLOBAL_RCS options; the
+former affects all startup files, while the second only affects global
+startup files (those shown here with an path starting with a /). If
+one of the options is unset at any point, any subsequent startup file(s)
+of the corresponding type will not be read. It is also possible for a
+file in $ZDOTDIR to re-enable GLOBAL_RCS. Both RCS and GLOBAL_RCS are
+set by default.
+
+Commands are then read from $ZDOTDIR/.zshenv. If the shell is a login
+shell, commands are read from /etc/zprofile and then $ZDOTDIR/.zprofile. Then,
+if the shell is interactive, commands are read from /etc/zshrc and then
+$ZDOTDIR/.zshrc. Finally, if the shell is a login shell, /etc/zlogin
+and $ZDOTDIR/.zlogin are read.
+
+When a login shell exits, the files $ZDOTDIR/.zlogout and then
+/etc/zlogout are read. This happens with either an explicit exit via
+the exit or logout commands, or an implicit exit by reading end-of-file
+from the terminal. However, if the shell terminates due to exec'ing
+another process, the logout files are not read. These are also
+affected by the RCS and GLOBAL_RCS options. Note also that the RCS
+option affects the saving of history files, i.e. if RCS is unset when
+the shell exits, no history file will be saved.
+
+If ZDOTDIR is unset, HOME is used instead. Files listed above as being
+in /etc may be in another directory, depending on the installation.
+
+As /etc/zshenv is run for all instances of zsh, it is important that it
+be kept as small as possible. In particular, it is a good idea to put
+code that does not need to be run for every single shell behind a test
+of the form `if [[ -o rcs ]]; then ...' so that it will not be executed
+when zsh is invoked with the `-f' option.
+
+5.2 Files
+=========
+
+
+$ZDOTDIR/.zshenv
+
+$ZDOTDIR/.zprofile
+
+$ZDOTDIR/.zshrc
+
+$ZDOTDIR/.zlogin
+
+$ZDOTDIR/.zlogout
+
+${TMPPREFIX}* (default is /tmp/zsh*)
+
+/etc/zshenv
+
+/etc/zprofile
+
+/etc/zshrc
+
+/etc/zlogin
+
+/etc/zlogout (installation-specific - /etc is the default)
+
+
+Any of these files may be pre-compiled with the zcompile builtin
+command (*Note Shell Builtin Commands::). If a compiled file exists
+(named for the original file plus the .zwc extension) and it is newer
+than the original file, the compiled file will be used instead.
+
+
+File: zsh.info, Node: Shell Grammar, Next: Redirection, Prev: Files, Up: Top
+
+6 Shell Grammar
+***************
+
+
+
+* Menu:
+
+* Simple Commands & Pipelines::
+* Precommand Modifiers::
+* Complex Commands::
+* Alternate Forms For Complex Commands::
+* Reserved Words::
+* Errors::
+* Comments::
+* Aliasing::
+* Quoting::
+
+
+File: zsh.info, Node: Simple Commands & Pipelines, Next: Precommand Modifiers, Up: Shell Grammar
+
+6.1 Simple Commands & Pipelines
+===============================
+
+A _simple command_ is a sequence of optional parameter assignments
+followed by blank-separated words, with optional redirections
+interspersed. For a description of assignment, see the beginning of
+*Note Parameters::.
+
+The first word is the command to be executed, and the remaining words,
+if any, are arguments to the command. If a command name is given, the
+parameter assignments modify the environment of the command when it is
+executed. The value of a simple command is its exit status, or 128
+plus the signal number if terminated by a signal. For example,
+
+
+ echo foo
+
+is a simple command with arguments.
+
+A _pipeline_ is either a simple command, or a sequence of two or more
+simple commands where each command is separated from the next by `|' or
+`|&'. Where commands are separated by `|', the standard output of the
+first command is connected to the standard input of the next. `|&' is
+shorthand for `2>&1 |', which connects both the standard output and the
+standard error of the command to the standard input of the next. The
+value of a pipeline is the value of the last command, unless the
+pipeline is preceded by `!' in which case the value is the logical
+inverse of the value of the last command. For example,
+
+
+ echo foo | sed 's/foo/bar/'
+
+is a pipeline, where the output (`foo' plus a newline) of the first
+command will be passed to the input of the second.
+
+If a pipeline is preceded by `coproc', it is executed as a coprocess; a
+two-way pipe is established between it and the parent shell. The shell
+can read from or write to the coprocess by means of the `>&p' and `<&p'
+redirection operators or with `print -p' and `read -p'. A pipeline
+cannot be preceded by both `coproc' and `!'. If job control is active,
+the coprocess can be treated in other than input and output as an
+ordinary background job.
+
+A _sublist_ is either a single pipeline, or a sequence of two or more
+pipelines separated by `&&' or `||'. If two pipelines are separated by
+`&&', the second pipeline is executed only if the first succeeds
+(returns a zero status). If two pipelines are separated by `||', the
+second is executed only if the first fails (returns a nonzero status).
+Both operators have equal precedence and are left associative. The
+value of the sublist is the value of the last pipeline executed. For
+example,
+
+
+ dmesg | grep panic && print yes
+
+is a sublist consisting of two pipelines, the second just a simple
+command which will be executed if and only if the grep command returns
+a zero status. If it does not, the value of the sublist is that return
+status, else it is the status returned by the print (almost certainly
+zero).
+
+A _list_ is a sequence of zero or more sublists, in which each sublist
+is terminated by `;', `&', `&|', `&!', or a newline. This terminator
+may optionally be omitted from the last sublist in the list when the
+list appears as a complex command inside `(...)' or `{...}'. When a
+sublist is terminated by `;' or newline, the shell waits for it to
+finish before executing the next sublist. If a sublist is terminated
+by a `&', `&|', or `&!', the shell executes the last pipeline in it in
+the background, and does not wait for it to finish (note the difference
+from other shells which execute the whole sublist in the background).
+A backgrounded pipeline returns a status of zero.
+
+More generally, a list can be seen as a set of any shell commands
+whatsoever, including the complex commands below; this is implied
+wherever the word `list' appears in later descriptions. For example,
+the commands in a shell function form a special sort of list.
+
+
+File: zsh.info, Node: Precommand Modifiers, Next: Complex Commands, Prev: Simple Commands & Pipelines, Up: Shell Grammar
+
+6.2 Precommand Modifiers
+========================
+
+A simple command may be preceded by a _precommand modifier_, which will
+alter how the command is interpreted. These modifiers are shell
+builtin commands with the exception of nocorrect which is a reserved
+word.
+
+
+-
+ The command is executed with a `-' prepended to its argv[0] string.
+
+builtin
+ The command word is taken to be the name of a builtin command,
+ rather than a shell function or external command.
+
+command [ -pvV ]
+ The command word is taken to be the name of an external command,
+ rather than a shell function or builtin. If the POSIX_BUILTINS
+ option is set, builtins will also be executed but certain special
+ properties of them are suppressed. The -p flag causes a default
+ path to be searched instead of that in $path. With the -v flag,
+ command is similar to whence and with -V, it is equivalent to
+ whence -v.
+
+exec [ -cl ] [ -a ARGV0 ]
+ The following command together with any arguments is run in place
+ of the current process, rather than as a sub-process. The shell
+ does not fork and is replaced. The shell does not invoke
+ TRAPEXIT, nor does it source zlogout files. The options are
+ provided for compatibility with other shells.
+
+ The -c option clears the environment.
+
+ The -l option is equivalent to the - precommand modifier, to treat
+ the replacement command as a login shell; the command is executed
+ with a - prepended to its argv[0] string. This flag has no effect
+ if used together with the -a option.
+
+ The -a option is used to specify explicitly the argv[0] string
+ (the name of the command as seen by the process itself) to be used
+ by the replacement command and is directly equivalent to setting a
+ value for the ARGV0 environment variable.
+
+nocorrect
+ Spelling correction is not done on any of the words. This must
+ appear before any other precommand modifier, as it is interpreted
+ immediately, before any parsing is done. It has no effect in
+ non-interactive shells.
+
+noglob
+ Filename generation (globbing) is not performed on any of the
+ words.
+
+
+
+File: zsh.info, Node: Complex Commands, Next: Alternate Forms For Complex Commands, Prev: Precommand Modifiers, Up: Shell Grammar
+
+6.3 Complex Commands
+====================
+
+A _complex command_ in zsh is one of the following:
+
+
+if LIST then LIST [ elif LIST then LIST ] ... [ else LIST ] fi
+ The if LIST is executed, and if it returns a zero exit status, the
+ then LIST is executed. Otherwise, the elif LIST is executed and
+ if its status is zero, the then LIST is executed. If each elif
+ LIST returns nonzero status, the else LIST is executed.
+
+for NAME ... [ in WORD ... ] TERM do LIST done
+ Expand the list of WORDs, and set the parameter NAME to each of
+ them in turn, executing LIST each time. If the `in WORD' is
+ omitted, use the positional parameters instead of the WORDs.
+
+ The TERM consists of one or more newline or ; which terminate the
+ WORDs, and are optional when the `in WORD' is omitted.
+
+ More than one parameter NAME can appear before the list of WORDs.
+ If N NAMEs are given, then on each execution of the loop the next
+ N WORDs are assigned to the corresponding parameters. If there
+ are more NAMEs than remaining WORDs, the remaining parameters are
+ each set to the empty string. Execution of the loop ends when
+ there is no remaining WORD to assign to the first NAME. It is
+ only possible for in to appear as the first NAME in the list, else
+ it will be treated as marking the end of the list.
+
+for (( [EXPR1] ; [EXPR2] ; [EXPR3] )) do LIST done
+ The arithmetic expression EXPR1 is evaluated first (see *Note
+ Arithmetic Evaluation::). The arithmetic expression EXPR2 is
+ repeatedly evaluated until it evaluates to zero and when non-zero,
+ LIST is executed and the arithmetic expression EXPR3 evaluated.
+ If any expression is omitted, then it behaves as if it evaluated
+ to 1.
+
+while LIST do LIST done
+ Execute the do LIST as long as the while LIST returns a zero exit
+ status.
+
+until LIST do LIST done
+ Execute the do LIST as long as until LIST returns a nonzero exit
+ status.
+
+repeat WORD do LIST done
+ WORD is expanded and treated as an arithmetic expression, which
+ must evaluate to a number N. LIST is then executed N times.
+
+ The repeat syntax is disabled by default when the shell starts in
+ a mode emulating another shell. It can be enabled with the
+ command `enable -r repeat'
+
+case WORD in [ [(] PATTERN [ | PATTERN ] ... ) LIST (;;|;&|;|) ] ... esac
+ Execute the LIST associated with the first PATTERN that matches
+ WORD, if any. The form of the patterns is the same as that used
+ for filename generation. See *Note Filename Generation::.
+
+ Note further that, unless the SH_GLOB option is set, the whole
+ pattern with alternatives is treated by the shell as equivalent to
+ a group of patterns within parentheses, although white space may
+ appear about the parentheses and the vertical bar and will be
+ stripped from the pattern at those points. White space may appear
+ elsewhere in the pattern; this is not stripped. If the SH_GLOB
+ option is set, so that an opening parenthesis can be unambiguously
+ treated as part of the case syntax, the expression is parsed into
+ separate words and these are treated as strict alternatives (as in
+ other shells).
+
+ If the LIST that is executed is terminated with ;& rather than ;;,
+ the following list is also executed. The rule for the terminator
+ of the following list ;;, ;& or ;| is applied unless the esac is
+ reached.
+
+ If the LIST that is executed is terminated with ;| the shell
+ continues to scan the PATTERNs looking for the next match,
+ executing the corresponding LIST, and applying the rule for the
+ corresponding terminator ;;, ;& or ;|. Note that WORD is not
+ re-expanded; all applicable PATTERNs are tested with the same WORD.
+
+select NAME [ in WORD ... TERM ] do LIST done
+ where TERM is one or more newline or ; to terminate the WORDs. Print
+ the set of WORDs, each preceded by a number. If the in WORD is
+ omitted, use the positional parameters. The PROMPT3 prompt is
+ printed and a line is read from the line editor if the shell is
+ interactive and that is active, or else standard input. If this
+ line consists of the number of one of the listed WORDs, then the
+ parameter NAME is set to the WORD corresponding to this number.
+ If this line is empty, the selection list is printed again.
+ Otherwise, the value of the parameter NAME is set to null. The
+ contents of the line read from standard input is saved in the
+ parameter REPLY. LIST is executed for each selection until a
+ break or end-of-file is encountered.
+
+( LIST )
+ Execute LIST in a subshell. Traps set by the trap builtin are
+ reset to their default values while executing LIST.
+
+{ LIST }
+ Execute LIST.
+
+{ TRY-LIST } always { ALWAYS-LIST }
+ First execute TRY-LIST. Regardless of errors, or break or
+ continue commands encountered within TRY-LIST, execute
+ ALWAYS-LIST. Execution then continues from the result of the
+ execution of TRY-LIST; in other words, any error, or break or
+ continue command is treated in the normal way, as if ALWAYS-LIST
+ were not present. The two chunks of code are referred to as the
+ `try block' and the `always block'.
+
+ Optional newlines or semicolons may appear after the always; note,
+ however, that they may _not_ appear between the preceding closing
+ brace and the always.
+
+ An `error' in this context is a condition such as a syntax error
+ which causes the shell to abort execution of the current function,
+ script, or list. Syntax errors encountered while the shell is
+ parsing the code do not cause the ALWAYS-LIST to be executed. For
+ example, an erroneously constructed if block in TRY-LIST would
+ cause the shell to abort during parsing, so that ALWAYS-LIST would
+ not be executed, while an erroneous substitution such as ${*foo*}
+ would cause a run-time error, after which ALWAYS-LIST would be
+ executed.
+
+ An error condition can be tested and reset with the special integer
+ variable TRY_BLOCK_ERROR. Outside an ALWAYS-LIST the value is
+ irrelevant, but it is initialised to -1. Inside ALWAYS-LIST, the
+ value is 1 if an error occurred in the TRY-LIST, else 0. If
+ TRY_BLOCK_ERROR is set to 0 during the ALWAYS-LIST, the error
+ condition caused by the TRY-LIST is reset, and shell execution
+ continues normally after the end of ALWAYS-LIST. Altering the
+ value during the TRY-LIST is not useful (unless this forms part of
+ an enclosing always block).
+
+ Regardless of TRY_BLOCK_ERROR, after the end of ALWAYS-LIST the
+ normal shell status $? is the value returned from TRY-LIST. This
+ will be non-zero if there was an error, even if TRY_BLOCK_ERROR
+ was set to zero.
+
+ The following executes the given code, ignoring any errors it
+ causes. This is an alternative to the usual convention of
+ protecting code by executing it in a subshell.
+
+
+ {
+ # code which may cause an error
+ } always {
+ # This code is executed regardless of the error.
+ (( TRY_BLOCK_ERROR = 0 ))
+ }
+ # The error condition has been reset.
+
+ When a try block occurs outside of any function, a return or a
+ exit encountered in TRY-LIST does _not_ cause the execution of
+ ALWAYS-LIST. Instead, the shell exits immediately after any EXIT
+ trap has been executed. Otherwise, a return command encountered
+ in TRY-LIST will cause the execution of ALWAYS-LIST, just like
+ break and continue.
+
+
+
+function WORD ... [ () ] [ TERM ] { LIST }
+WORD ... () [ TERM ] { LIST }
+WORD ... () [ TERM ] COMMAND
+ where TERM is one or more newline or ;. Define a function which
+ is referenced by any one of WORD. Normally, only one WORD is
+ provided; multiple WORDs are usually only useful for setting traps.
+ The body of the function is the LIST between the { and }. See
+ *Note Functions::.
+
+ If the option SH_GLOB is set for compatibility with other shells,
+ then whitespace may appear between the left and right parentheses
+ when there is a single WORD; otherwise, the parentheses will be
+ treated as forming a globbing pattern in that case.
+
+ In any of the forms above, a redirection may appear outside the
+ function body, for example
+
+
+ func() { ... } 2>&1
+
+ The redirection is stored with the function and applied whenever
+ the function is executed. Any variables in the redirection are
+ expanded at the point the function is executed, but outside the
+ function scope.
+
+time [ PIPELINE ]
+ The PIPELINE is executed, and timing statistics are reported on
+ the standard error in the form specified by the TIMEFMT parameter.
+ If PIPELINE is omitted, print statistics about the shell process
+ and its children.
+
+[[ EXP ]]
+ Evaluates the conditional expression EXP and return a zero exit
+ status if it is true. See *Note Conditional Expressions:: for a
+ description of EXP.
+
+
+
+File: zsh.info, Node: Alternate Forms For Complex Commands, Next: Reserved Words, Prev: Complex Commands, Up: Shell Grammar
+
+6.4 Alternate Forms For Complex Commands
+========================================
+
+Many of zsh's complex commands have alternate forms. These are
+non-standard and are likely not to be obvious even to seasoned shell
+programmers; they should not be used anywhere that portability of shell
+code is a concern.
+
+The short versions below only work if SUBLIST is of the form `{ LIST }'
+or if the SHORT_LOOPS option is set. For the if, while and until
+commands, in both these cases the test part of the loop must also be
+suitably delimited, such as by `[[ ... ]]' or `(( ... ))', else the end
+of the test will not be recognized. For the for, repeat, case and
+select commands no such special form for the arguments is necessary,
+but the other condition (the special form of SUBLIST or use of the
+SHORT_LOOPS option) still applies.
+
+
+if LIST { LIST } [ elif LIST { LIST } ] ... [ else { LIST } ]
+ An alternate form of if. The rules mean that
+
+
+ if [[ -o ignorebraces ]] {
+ print yes
+ }
+
+ works, but
+
+
+ if true { # Does not work!
+ print yes
+ }
+
+ does _not_, since the test is not suitably delimited.
+
+if LIST SUBLIST
+ A short form of the alternate if. The same limitations on the
+ form of LIST apply as for the previous form.
+
+for NAME ... ( WORD ... ) SUBLIST
+ A short form of for.
+
+for NAME ... [ in WORD ... ] TERM SUBLIST
+ where TERM is at least one newline or ;. Another short form of
+ for.
+
+for (( [EXPR1] ; [EXPR2] ; [EXPR3] )) SUBLIST
+ A short form of the arithmetic for command.
+
+foreach NAME ... ( WORD ... ) LIST end
+ Another form of for.
+
+while LIST { LIST }
+ An alternative form of while. Note the limitations on the form of
+ LIST mentioned above.
+
+until LIST { LIST }
+ An alternative form of until. Note the limitations on the form of
+ LIST mentioned above.
+
+repeat WORD SUBLIST
+ This is a short form of repeat.
+
+case WORD { [ [(] PATTERN [ | PATTERN ] ... ) LIST (;;|;&|;|) ] ... }
+ An alternative form of case.
+
+select NAME [ in WORD ... TERM ] SUBLIST
+ where TERM is at least one newline or ;. A short form of select.
+
+function WORD ... [ () ] [ TERM ] SUBLIST
+ This is a short form of function.
+
+
+
+File: zsh.info, Node: Reserved Words, Next: Errors, Prev: Alternate Forms For Complex Commands, Up: Shell Grammar
+
+6.5 Reserved Words
+==================
+
+The following words are recognized as reserved words when used as the
+first word of a command unless quoted or disabled using disable -r:
+
+do done esac then elif else fi for case if while function repeat time
+until select coproc nocorrect foreach end ! [[ { } declare export float
+integer local readonly typeset
+
+Additionally, `}' is recognized in any position if neither the
+IGNORE_BRACES option nor the IGNORE_CLOSE_BRACES option is set.
+
+
+File: zsh.info, Node: Errors, Next: Comments, Prev: Reserved Words, Up: Shell Grammar
+
+6.6 Errors
+==========
+
+Certain errors are treated as fatal by the shell: in an interactive
+shell, they cause control to return to the command line, and in a
+non-interactive shell they cause the shell to be aborted. In older
+versions of zsh, a non-interactive shell running a script would not
+abort completely, but would resume execution at the next command to be
+read from the script, skipping the remainder of any functions or shell
+constructs such as loops or conditions; this somewhat illogical
+behaviour can be recovered by setting the option CONTINUE_ON_ERROR.
+
+Fatal errors found in non-interactive shells include:
+
+
+ * Failure to parse shell options passed when invoking the shell
+
+ * Failure to change options with the set builtin
+
+ * Parse errors of all sorts, including failures to parse
+ mathematical expressions
+
+ * Failures to set or modify variable behaviour with typeset, local,
+ declare, export, integer, float
+
+ * Execution of incorrectly positioned loop control structures
+ (continue, break)
+
+ * Attempts to use regular expression with no regular expression
+ module available
+
+ * Disallowed operations when the RESTRICTED options is set
+
+ * Failure to create a pipe needed for a pipeline
+
+ * Failure to create a multio
+
+ * Failure to autoload a module needed for a declared shell feature
+
+ * Errors creating command or process substitutions
+
+ * Syntax errors in glob qualifiers
+
+ * File generation errors where not caught by the option BAD_PATTERN
+
+ * All bad patterns used for matching within case statements
+
+ * File generation failures where not caused by NO_MATCH or similar
+ options
+
+ * All file generation errors where the pattern was used to create a
+ multio
+
+ * Memory errors where detected by the shell
+
+ * Invalid subscripts to shell variables
+
+ * Attempts to assign read-only variables
+
+ * Logical errors with variables such as assignment to the wrong type
+
+ * Use of invalid variable names
+
+ * Errors in variable substitution syntax
+
+ * Failure to convert characters in $'...' expressions
+
+If the POSIX_BUILTINS option is set, more errors associated with shell
+builtin commands are treated as fatal, as specified by the POSIX
+standard.
+
+
+
+
+File: zsh.info, Node: Comments, Next: Aliasing, Prev: Errors, Up: Shell Grammar
+
+6.7 Comments
+============
+
+In non-interactive shells, or in interactive shells with the
+INTERACTIVE_COMMENTS option set, a word beginning with the third
+character of the histchars parameter (`#' by default) causes that word
+and all the following characters up to a newline to be ignored.
+
+
+File: zsh.info, Node: Aliasing, Next: Quoting, Prev: Comments, Up: Shell Grammar
+
+6.8 Aliasing
+============
+
+Every eligible _word_ in the shell input is checked to see if there is
+an alias defined for it. If so, it is replaced by the text of the
+alias if it is in command position (if it could be the first word of a
+simple command), or if the alias is global. If the replacement text
+ends with a space, the next word in the shell input is always eligible
+for purposes of alias expansion. An alias is defined using the alias
+builtin; global aliases may be defined using the -g option to that
+builtin.
+
+A _word_ is defined as:
+
+
+ * Any plain string or glob pattern
+
+ * Any quoted string, using any quoting method (note that the quotes
+ must be part of the alias definition for this to be eligible)
+
+ * Any parameter reference or command substitution
+
+ * Any series of the foregoing, concatenated without whitespace or
+ other tokens between them
+
+ * Any reserved word (case, do, else, etc.)
+
+ * With global aliasing, any command separator, any redirection
+ operator, and `(' or `)' when not part of a glob pattern
+
+Alias expansion is done on the shell input before any other expansion
+except history expansion. Therefore, if an alias is defined for the
+word foo, alias expansion may be avoided by quoting part of the word,
+e.g. \foo. Any form of quoting works, although there is nothing to
+prevent an alias being defined for the quoted form such as \foo as well.
+
+When POSIX_ALIASES is set, only plain unquoted strings are eligible for
+aliasing. The alias builtin does not reject ineligible aliases, but
+they are not expanded.
+
+For use with completion, which would remove an initial backslash
+followed by a character that isn't special, it may be more convenient
+to quote the word by starting with a single quote, i.e. 'foo;
+completion will automatically add the trailing single quote.
+
+
+
+6.8.1 Alias difficulties
+------------------------
+
+Although aliases can be used in ways that bend normal shell syntax, not
+every string of non-white-space characters can be used as an alias.
+
+Any set of characters not listed as a word above is not a word, hence no
+attempt is made to expand it as an alias, no matter how it is defined
+(i.e. via the builtin or the special parameter aliases described in
+*Note The zsh/parameter Module::). However, as noted in the case of
+POSIX_ALIASES above, the shell does not attempt to deduce whether the
+string corresponds to a word at the time the alias is created.
+
+For example, an expression containing an = at the start of a command
+line is an assignment and cannot be expanded as an alias; a lone = is
+not an assignment but can only be set as an alias using the parameter,
+as otherwise the = is taken part of the syntax of the builtin command.
+
+It is not presently possible to alias the `((' token that introduces
+arithmetic expressions, because until a full statement has been parsed,
+it cannot be distinguished from two consecutive `(' tokens introducing
+nested subshells. Also, if a separator such as && is aliased, \&&
+turns into the two tokens \& and &, each of which may have been aliased
+separately. Similarly for \<<, \>|, etc.
+
+There is a commonly encountered problem with aliases illustrated by the
+following code:
+
+
+ alias echobar='echo bar'; echobar
+
+This prints a message that the command echobar could not be found.
+This happens because aliases are expanded when the code is read in; the
+entire line is read in one go, so that when echobar is executed it is
+too late to expand the newly defined alias. This is often a problem in
+shell scripts, functions, and code executed with `source' or `.'.
+Consequently, use of functions rather than aliases is recommended in
+non-interactive code.
+
+Note also the unhelpful interaction of aliases and function definitions:
+
+
+ alias func='noglob func'
+ func() {
+ echo Do something with $*
+ }
+
+Because aliases are expanded in function definitions, this causes the
+following command to be executed:
+
+
+ noglob func() {
+ echo Do something with $*
+ }
+
+which defines noglob as well as func as functions with the body given.
+To avoid this, either quote the name func or use the alternative
+function definition form `function func'. Ensuring the alias is
+defined after the function works but is problematic if the code
+fragment might be re-executed.
+
+
+
+
+File: zsh.info, Node: Quoting, Prev: Aliasing, Up: Shell Grammar
+
+6.9 Quoting
+===========
+
+A character may be _quoted_ (that is, made to stand for itself) by
+preceding it with a `\'. `\' followed by a newline is ignored.
+
+A string enclosed between `$'' and `'' is processed the same way as the
+string arguments of the print builtin, and the resulting string is
+considered to be entirely quoted. A literal `'' character can be
+included in the string by using the `\'' escape.
+
+All characters enclosed between a pair of single quotes ('') that is
+not preceded by a `$' are quoted. A single quote cannot appear within
+single quotes unless the option RC_QUOTES is set, in which case a pair
+of single quotes are turned into a single quote. For example,
+
+
+ print ''''
+
+outputs nothing apart from a newline if RC_QUOTES is not set, but one
+single quote if it is set.
+
+Inside double quotes (""), parameter and command substitution occur,
+and `\' quotes the characters `\', ``', `"', `$', and the first
+character of $histchars (default `!').
+
+
+File: zsh.info, Node: Redirection, Next: Command Execution, Prev: Shell Grammar, Up: Top
+
+7 Redirection
+*************
+
+If a command is followed by & and job control is not active, then the
+default standard input for the command is the empty file /dev/null.
+Otherwise, the environment for the execution of a command contains the
+file descriptors of the invoking shell as modified by input/output
+specifications.
+
+The following may appear anywhere in a simple command or may precede or
+follow a complex command. Expansion occurs before WORD or DIGIT is
+used except as noted below. If the result of substitution on WORD
+produces more than one filename, redirection occurs for each separate
+filename in turn.
+
+
+< WORD
+ Open file WORD for reading as standard input. It is an error to
+ open a file in this fashion if it does not exist.
+
+<> WORD
+ Open file WORD for reading and writing as standard input. If the
+ file does not exist then it is created.
+
+> WORD
+ Open file WORD for writing as standard output. If the file does
+ not exist then it is created. If the file exists, and the CLOBBER
+ option is unset, this causes an error; otherwise, it is truncated
+ to zero length.
+
+>| WORD
+>! WORD
+ Same as >, except that the file is truncated to zero length if it
+ exists, regardless of CLOBBER.
+
+>> WORD
+ Open file WORD for writing in append mode as standard output. If
+ the file does not exist, and the CLOBBER and APPEND_CREATE options
+ are both unset, this causes an error; otherwise, the file is
+ created.
+
+>>| WORD
+>>! WORD
+ Same as >>, except that the file is created if it does not exist,
+ regardless of CLOBBER and APPEND_CREATE.
+
+<<[-] WORD
+ The shell input is read up to a line that is the same as WORD, or
+ to an end-of-file. No parameter expansion, command substitution or
+ filename generation is performed on WORD. The resulting document,
+ called a _here-document_, becomes the standard input.
+
+ If any character of WORD is quoted with single or double quotes or
+ a `\', no interpretation is placed upon the characters of the
+ document. Otherwise, parameter and command substitution occurs,
+ `\' followed by a newline is removed, and `\' must be used to
+ quote the characters `\', `$', ``' and the first character of WORD.
+
+ Note that WORD itself does not undergo shell expansion. Backquotes
+ in WORD do not have their usual effect; instead they behave
+ similarly to double quotes, except that the backquotes themselves
+ are passed through unchanged. (This information is given for
+ completeness and it is not recommended that backquotes be used.)
+ Quotes in the form $'...' have their standard effect of expanding
+ backslashed references to special characters.
+
+ If <<- is used, then all leading tabs are stripped from WORD and
+ from the document.
+
+<<< WORD
+ Perform shell expansion on WORD and pass the result to standard
+ input. This is known as a _here-string_. Compare the use of WORD
+ in here-documents above, where WORD does not undergo shell
+ expansion.
+
+<& NUMBER
+>& NUMBER
+ The standard input/output is duplicated from file descriptor
+ NUMBER (see man page dup2(2)).
+
+<& -
+>& -
+ Close the standard input/output.
+
+<& p
+>& p
+ The input/output from/to the coprocess is moved to the standard
+ input/output.
+
+>& WORD
+&> WORD
+ (Except where `>& WORD' matches one of the above syntaxes; `&>'
+ can always be used to avoid this ambiguity.) Redirects both
+ standard output and standard error (file descriptor 2) in the
+ manner of `> WORD'. Note that this does _not_ have the same
+ effect as `> WORD 2>&1' in the presence of multios (see the
+ section below).
+
+>&| WORD
+>&! WORD
+&>| WORD
+&>! WORD
+ Redirects both standard output and standard error (file descriptor
+ 2) in the manner of `>| WORD'.
+
+>>& WORD
+&>> WORD
+ Redirects both standard output and standard error (file descriptor
+ 2) in the manner of `>> WORD'.
+
+>>&| WORD
+>>&! WORD
+&>>| WORD
+&>>! WORD
+ Redirects both standard output and standard error (file descriptor
+ 2) in the manner of `>>| WORD'.
+
+
+If one of the above is preceded by a digit, then the file descriptor
+referred to is that specified by the digit instead of the default 0 or
+1. The order in which redirections are specified is significant. The
+shell evaluates each redirection in terms of the (_file descriptor_,
+_file_) association at the time of evaluation. For example:
+
+
+
+ ... 1>FNAME 2>&1
+
+first associates file descriptor 1 with file FNAME. It then associates
+file descriptor 2 with the file associated with file descriptor 1 (that
+is, FNAME). If the order of redirections were reversed, file
+descriptor 2 would be associated with the terminal (assuming file
+descriptor 1 had been) and then file descriptor 1 would be associated
+with file FNAME.
+
+The `|&' command separator described in *Note Simple Commands &
+Pipelines:: is a shorthand for `2>&1 |'.
+
+The various forms of process substitution, `<(LIST)', and `=(LIST)' for
+input and `>(LIST)' for output, are often used together with
+redirection. For example, if WORD in an output redirection is of the
+form `>(LIST)' then the output is piped to the command represented by
+LIST. See *Note Process Substitution::.
+
+7.1 Opening file descriptors using parameters
+=============================================
+
+
+
+When the shell is parsing arguments to a command, and the shell option
+IGNORE_BRACES is not set, a different form of redirection is allowed:
+instead of a digit before the operator there is a valid shell identifier
+enclosed in braces. The shell will open a new file descriptor that is
+guaranteed to be at least 10 and set the parameter named by the
+identifier to the file descriptor opened. No whitespace is allowed
+between the closing brace and the redirection character. For example:
+
+
+
+ ... {myfd}>&1
+
+This opens a new file descriptor that is a duplicate of file descriptor
+1 and sets the parameter myfd to the number of the file descriptor,
+which will be at least 10. The new file descriptor can be written to
+using the syntax >&$myfd. The file descriptor remains open in subshells
+and forked external executables.
+
+The syntax {VARID}>&-, for example {myfd}>&-, may be used to close a
+file descriptor opened in this fashion. Note that the parameter given
+by VARID must previously be set to a file descriptor in this case.
+
+It is an error to open or close a file descriptor in this fashion when
+the parameter is readonly. However, it is not an error to read or
+write a file descriptor using <&$PARAM or >&$PARAM if PARAM is readonly.
+
+If the option CLOBBER is unset, it is an error to open a file
+descriptor using a parameter that is already set to an open file
+descriptor previously allocated by this mechanism. Unsetting the
+parameter before using it for allocating a file descriptor avoids the
+error.
+
+Note that this mechanism merely allocates or closes a file descriptor;
+it does not perform any redirections from or to it. It is usually
+convenient to allocate a file descriptor prior to use as an argument to
+exec. The syntax does not in any case work when used around complex
+commands such as parenthesised subshells or loops, where the opening
+brace is interpreted as part of a command list to be executed in the
+current shell.
+
+The following shows a typical sequence of allocation, use, and closing
+of a file descriptor:
+
+
+ integer myfd
+ exec {myfd}>~/logs/mylogfile.txt
+ print This is a log message. >&$myfd
+ exec {myfd}>&-
+
+Note that the expansion of the variable in the expression >&$myfd
+occurs at the point the redirection is opened. This is after the
+expansion of command arguments and after any redirections to the left
+on the command line have been processed.
+
+7.2 Multios
+===========
+
+If the user tries to open a file descriptor for writing more than once,
+the shell opens the file descriptor as a pipe to a process that copies
+its input to all the specified outputs, similar to `tee', provided the
+MULTIOS option is set, as it is by default. Thus:
+
+
+ date >foo >bar
+
+writes the date to two files, named `foo' and `bar'. Note that a pipe
+is an implicit redirection; thus
+
+
+ date >foo | cat
+
+writes the date to the file `foo', and also pipes it to cat.
+
+Note that the shell opens all the files to be used in the multio process
+immediately, not at the point they are about to be written.
+
+Note also that redirections are always expanded in order. This happens
+regardless of the setting of the MULTIOS option, but with the option in
+effect there are additional consequences. For example, the meaning of
+the expression >&1 will change after a previous redirection:
+
+
+ date >&1 >output
+
+In the case above, the >&1 refers to the standard output at the start
+of the line; the result is similar to the tee command. However,
+consider:
+
+
+ date >output >&1
+
+As redirections are evaluated in order, when the >&1 is encountered the
+standard output is set to the file output and another copy of the
+output is therefore sent to that file. This is unlikely to be what is
+intended.
+
+If the MULTIOS option is set, the word after a redirection operator is
+also subjected to filename generation (globbing). Thus
+
+
+ : > *
+
+will truncate all files in the current directory, assuming there's at
+least one. (Without the MULTIOS option, it would create an empty file
+called `*'.) Similarly, you can do
+
+
+ echo exit 0 >> *.sh
+
+If the user tries to open a file descriptor for reading more than once,
+the shell opens the file descriptor as a pipe to a process that copies
+all the specified inputs to its output in the order specified, provided
+the MULTIOS option is set. It should be noted that each file is opened
+immediately, not at the point where it is about to be read: this
+behaviour differs from cat, so if strictly standard behaviour is
+needed, cat should be used instead.
+
+Thus
+
+
+ sort <foo <fubar
+
+or even
+
+
+ sort <f{oo,ubar}
+
+is equivalent to `cat foo fubar | sort'.
+
+Expansion of the redirection argument occurs at the point the
+redirection is opened, at the point described above for the expansion
+of the variable in >&$myfd.
+
+Note that a pipe is an implicit redirection; thus
+
+
+ cat bar | sort <foo
+
+is equivalent to `cat bar foo | sort' (note the order of the inputs).
+
+If the MULTIOS option is _un_set, each redirection replaces the
+previous redirection for that file descriptor. However, all files
+redirected to are actually opened, so
+
+
+ echo Hello > bar > baz
+
+when MULTIOS is unset will truncate `bar', and write `Hello' into `baz'.
+
+There is a problem when an output multio is attached to an external
+program. A simple example shows this:
+
+
+ cat file >file1 >file2
+ cat file1 file2
+
+Here, it is possible that the second `cat' will not display the full
+contents of file1 and file2 (i.e. the original contents of file
+repeated twice).
+
+The reason for this is that the multios are spawned after the cat
+process is forked from the parent shell, so the parent shell does not
+wait for the multios to finish writing data. This means the command as
+shown can exit before file1 and file2 are completely written. As a
+workaround, it is possible to run the cat process as part of a job in
+the current shell:
+
+
+ { cat file } >file >file2
+
+Here, the {...} job will pause to wait for both files to be written.
+
+
+
+7.3 Redirections with no command
+================================
+
+When a simple command consists of one or more redirection operators and
+zero or more parameter assignments, but no command name, zsh can behave
+in several ways.
+
+If the parameter NULLCMD is not set or the option CSH_NULLCMD is set,
+an error is caused. This is the `csh' behavior and CSH_NULLCMD is set
+by default when emulating `csh'.
+
+If the option SH_NULLCMD is set, the builtin `:' is inserted as a
+command with the given redirections. This is the default when emulating
+`sh' or `ksh'.
+
+Otherwise, if the parameter NULLCMD is set, its value will be used as a
+command with the given redirections. If both NULLCMD and READNULLCMD
+are set, then the value of the latter will be used instead of that of
+the former when the redirection is an input. The default for NULLCMD
+is `cat' and for READNULLCMD is `more'. Thus
+
+
+ < file
+
+shows the contents of file on standard output, with paging if that is a
+terminal. NULLCMD and READNULLCMD may refer to shell functions.
+
+
+
+
+File: zsh.info, Node: Command Execution, Next: Functions, Prev: Redirection, Up: Top
+
+8 Command Execution
+*******************
+
+If a command name contains no slashes, the shell attempts to locate it.
+If there exists a shell function by that name, the function is invoked
+as described in *Note Functions::. If there exists a shell builtin by
+that name, the builtin is invoked.
+
+Otherwise, the shell searches each element of $path for a directory
+containing an executable file by that name. If the search is
+unsuccessful, the shell prints an error message and returns a nonzero
+exit status.
+
+If execution fails because the file is not in executable format, and
+the file is not a directory, it is assumed to be a shell script.
+/bin/sh is spawned to execute it. If the program is a file beginning
+with `#!', the remainder of the first line specifies an interpreter for
+the program. The shell will execute the specified interpreter on
+operating systems that do not handle this executable format in the
+kernel.
+
+If no external command is found but a function command_not_found_handler
+exists the shell executes this function with all command line
+arguments. The return status of the function becomes the status of the
+command. If the function wishes to mimic the behaviour of the shell
+when the command is not found, it should print the message `command not
+found: CMD' to standard error and return status 127. Note that the
+handler is executed in a subshell forked to execute an external
+command, hence changes to directories, shell parameters, etc. have no
+effect on the main shell.
+
+
+
+
+File: zsh.info, Node: Functions, Next: Jobs & Signals, Prev: Command Execution, Up: Top
+
+9 Functions
+***********
+
+Shell functions are defined with the function reserved word or the
+special syntax `FUNCNAME ()'. Shell functions are read in and stored
+internally. Alias names are resolved when the function is read.
+Functions are executed like commands with the arguments passed as
+positional parameters. (See *Note Command Execution::.)
+
+Functions execute in the same process as the caller and share all files
+and present working directory with the caller. A trap on EXIT set
+inside a function is executed after the function completes in the
+environment of the caller.
+
+The return builtin is used to return from function calls.
+
+Function identifiers can be listed with the functions builtin. Functions
+can be undefined with the unfunction builtin.
+
+9.1 Autoloading Functions
+=========================
+
+
+
+A function can be marked as _undefined_ using the autoload builtin (or
+`functions -u' or `typeset -fu'). Such a function has no body. When
+the function is first executed, the shell searches for its definition
+using the elements of the fpath variable. Thus to define functions for
+autoloading, a typical sequence is:
+
+
+ fpath=(~/myfuncs $fpath)
+ autoload myfunc1 myfunc2 ...
+
+The usual alias expansion during reading will be suppressed if the
+autoload builtin or its equivalent is given the option -U. This is
+recommended for the use of functions supplied with the zsh distribution. Note
+that for functions precompiled with the zcompile builtin command the
+flag -U must be provided when the .zwc file is created, as the
+corresponding information is compiled into the latter.
+
+For each ELEMENT in fpath, the shell looks for three possible files,
+the newest of which is used to load the definition for the function:
+
+
+ELEMENT.zwc
+ A file created with the zcompile builtin command, which is
+ expected to contain the definitions for all functions in the
+ directory named ELEMENT. The file is treated in the same manner
+ as a directory containing files for functions and is searched for
+ the definition of the function. If the definition is not found,
+ the search for a definition proceeds with the other two
+ possibilities described below.
+
+ If ELEMENT already includes a .zwc extension (i.e. the extension
+ was explicitly given by the user), ELEMENT is searched for the
+ definition of the function without comparing its age to that of
+ other files; in fact, there does not need to be any directory
+ named ELEMENT without the suffix. Thus including an element such
+ as `/usr/local/funcs.zwc' in fpath will speed up the search for
+ functions, with the disadvantage that functions included must be
+ explicitly recompiled by hand before the shell notices any changes.
+
+ELEMENT/FUNCTION.zwc
+ A file created with zcompile, which is expected to contain the
+ definition for FUNCTION. It may include other function definitions
+ as well, but those are neither loaded nor executed; a file found
+ in this way is searched _only_ for the definition of FUNCTION.
+
+ELEMENT/FUNCTION
+ A file of zsh command text, taken to be the definition for
+ FUNCTION.
+
+
+In summary, the order of searching is, first, in the _parents of_
+directories in fpath for the newer of either a compiled directory or a
+directory in fpath; second, if more than one of these contains a
+definition for the function that is sought, the leftmost in the fpath
+is chosen; and third, within a directory, the newer of either a compiled
+function or an ordinary function definition is used.
+
+If the KSH_AUTOLOAD option is set, or the file contains only a simple
+definition of the function, the file's contents will be executed. This
+will normally define the function in question, but may also perform
+initialization, which is executed in the context of the function
+execution, and may therefore define local parameters. It is an error
+if the function is not defined by loading the file.
+
+Otherwise, the function body (with no surrounding `FUNCNAME() {...}')
+is taken to be the complete contents of the file. This form allows the
+file to be used directly as an executable shell script. If processing
+of the file results in the function being re-defined, the function
+itself is not re-executed. To force the shell to perform
+initialization and then call the function defined, the file should
+contain initialization code (which will be executed then discarded) in
+addition to a complete function definition (which will be retained for
+subsequent calls to the function), and a call to the shell function,
+including any arguments, at the end.
+
+For example, suppose the autoload file func contains
+
+
+ func() { print This is func; }
+ print func is initialized
+
+then `func; func' with KSH_AUTOLOAD set will produce both messages on
+the first call, but only the message `This is func' on the second and
+subsequent calls. Without KSH_AUTOLOAD set, it will produce the
+initialization message on the first call, and the other message on the
+second and subsequent calls.
+
+It is also possible to create a function that is not marked as
+autoloaded, but which loads its own definition by searching fpath, by
+using `autoload -X' within a shell function. For example, the
+following are equivalent:
+
+
+ myfunc() {
+ autoload -X
+ }
+ myfunc args...
+
+and
+
+
+ unfunction myfunc # if myfunc was defined
+ autoload myfunc
+ myfunc args...
+
+In fact, the functions command outputs `builtin autoload -X' as the
+body of an autoloaded function. This is done so that
+
+
+ eval "$(functions)"
+
+produces a reasonable result. A true autoloaded function can be
+identified by the presence of the comment `# undefined' in the body,
+because all comments are discarded from defined functions.
+
+To load the definition of an autoloaded function myfunc without
+executing myfunc, use:
+
+
+ autoload +X myfunc
+
+
+9.2 Anonymous Functions
+=======================
+
+
+
+If no name is given for a function, it is `anonymous' and is handled
+specially. Either form of function definition may be used: a `()' with
+no preceding name, or a `function' with an immediately following open
+brace. The function is executed immediately at the point of definition
+and is not stored for future use. The function name is set to `(anon)'.
+
+Arguments to the function may be specified as words following the
+closing brace defining the function, hence if there are none no
+arguments (other than $0) are set. This is a difference from the way
+other functions are parsed: normal function definitions may be followed
+by certain keywords such as `else' or `fi', which will be treated as
+arguments to anonymous functions, so that a newline or semicolon is
+needed to force keyword interpretation.
+
+Note also that the argument list of any enclosing script or function is
+hidden (as would be the case for any other function called at this
+point).
+
+Redirections may be applied to the anonymous function in the same
+manner as to a current-shell structure enclosed in braces. The main
+use of anonymous functions is to provide a scope for local variables.
+This is particularly convenient in start-up files as these do not
+provide their own local variable scope.
+
+For example,
+
+
+ variable=outside
+ function {
+ local variable=inside
+ print "I am $variable with arguments $*"
+ } this and that
+ print "I am $variable"
+
+outputs the following:
+
+
+ I am inside with arguments this and that
+ I am outside
+
+Note that function definitions with arguments that expand to nothing,
+for example `name=; function $name { ... }', are not treated as
+anonymous functions. Instead, they are treated as normal function
+definitions where the definition is silently discarded.
+
+
+
+9.3 Special Functions
+=====================
+
+Certain functions, if defined, have special meaning to the shell.
+
+
+
+9.3.1 Hook Functions
+--------------------
+
+
+
+For the functions below, it is possible to define an array that has the
+same name as the function with `_functions' appended. Any element in
+such an array is taken as the name of a function to execute; it is
+executed in the same context and with the same arguments as the basic
+function. For example, if $chpwd_functions is an array containing the
+values `mychpwd', `chpwd_save_dirstack', then the shell attempts to
+execute the functions `chpwd', `mychpwd' and `chpwd_save_dirstack', in
+that order. Any function that does not exist is silently ignored. A
+function found by this mechanism is referred to elsewhere as a `hook
+function'. An error in any function causes subsequent functions not to
+be run. Note further that an error in a precmd hook causes an
+immediately following periodic function not to run (though it may run
+at the next opportunity).
+
+
+chpwd
+ Executed whenever the current working directory is changed.
+
+periodic
+ If the parameter PERIOD is set, this function is executed every
+ $PERIOD seconds, just before a prompt. Note that if multiple
+ functions are defined using the array periodic_functions only one
+ period is applied to the complete set of functions, and the
+ scheduled time is not reset if the list of functions is altered.
+ Hence the set of functions is always called together.
+
+precmd
+ Executed before each prompt. Note that precommand functions are
+ not re-executed simply because the command line is redrawn, as
+ happens, for example, when a notification about an exiting job is
+ displayed.
+
+preexec
+ Executed just after a command has been read and is about to be
+ executed. If the history mechanism is active (regardless of
+ whether the line was discarded from the history buffer), the
+ string that the user typed is passed as the first argument,
+ otherwise it is an empty string. The actual command that will be
+ executed (including expanded aliases) is passed in two different
+ forms: the second argument is a single-line, size-limited version
+ of the command (with things like function bodies elided); the
+ third argument contains the full text that is being executed.
+
+zshaddhistory
+ Executed when a history line has been read interactively, but
+ before it is executed. The sole argument is the complete history
+ line (so that any terminating newline will still be present).
+
+ If any of the hook functions returns status 1 (or any non-zero
+ value other than 2, though this is not guaranteed for future
+ versions of the shell) the history line will not be saved,
+ although it lingers in the history until the next line is
+ executed, allowing you to reuse or edit it immediately.
+
+ If any of the hook functions returns status 2 the history line
+ will be saved on the internal history list, but not written to the
+ history file. In case of a conflict, the first non-zero status
+ value is taken.
+
+ A hook function may call `fc -p ...' to switch the history context
+ so that the history is saved in a different file from the that in
+ the global HISTFILE parameter. This is handled specially: the
+ history context is automatically restored after the processing of
+ the history line is finished.
+
+ The following example function works with one of the options
+ INC_APPEND_HISTORY or SHARE_HISTORY set, in order that the line is
+ written out immediately after the history entry is added. It first
+ adds the history line to the normal history with the newline
+ stripped, which is usually the correct behaviour. Then it
+ switches the history context so that the line will be written to a
+ history file in the current directory.
+
+
+ zshaddhistory() {
+ print -sr -- ${1%%$'\n'}
+ fc -p .zsh_local_history
+ }
+
+zshexit
+ Executed at the point where the main shell is about to exit
+ normally. This is not called by exiting subshells, nor when the
+ exec precommand modifier is used before an external command.
+ Also, unlike TRAPEXIT, it is not called when functions exit.
+
+
+
+9.3.2 Trap Functions
+--------------------
+
+The functions below are treated specially but do not have corresponding
+hook arrays.
+
+
+TRAPNAL
+ If defined and non-null, this function will be executed whenever
+ the shell catches a signal SIGNAL, where NAL is a signal name as
+ specified for the kill builtin. The signal number will be passed
+ as the first parameter to the function.
+
+ If a function of this form is defined and null, the shell and
+ processes spawned by it will ignore SIGNAL.
+
+ The return status from the function is handled specially. If it is
+ zero, the signal is assumed to have been handled, and execution
+ continues normally. Otherwise, the shell will behave as
+ interrupted except that the return status of the trap is retained.
+
+ Programs terminated by uncaught signals typically return the
+ status 128 plus the signal number. Hence the following causes the
+ handler for SIGINT to print a message, then mimic the usual effect
+ of the signal.
+
+
+ TRAPINT() {
+ print "Caught SIGINT, aborting."
+ return $(( 128 + $1 ))
+ }
+
+ The functions TRAPZERR, TRAPDEBUG and TRAPEXIT are never executed
+ inside other traps.
+
+TRAPDEBUG
+ If the option DEBUG_BEFORE_CMD is set (as it is by default),
+ executed before each command; otherwise executed after each
+ command. See the description of the trap builtin in *Note Shell
+ Builtin Commands:: for details of additional features provided in
+ debug traps.
+
+TRAPEXIT
+ Executed when the shell exits, or when the current function exits
+ if defined inside a function. The value of $? at the start of
+ execution is the exit status of the shell or the return status of
+ the function exiting.
+
+TRAPZERR
+ Executed whenever a command has a non-zero exit status. However,
+ the function is not executed if the command occurred in a sublist
+ followed by `&&' or `||'; only the final command in a sublist of
+ this type causes the trap to be executed. The function TRAPERR
+ acts the same as TRAPZERR on systems where there is no SIGERR
+ (this is the usual case).
+
+
+The functions beginning `TRAP' may alternatively be defined with the
+trap builtin: this may be preferable for some uses. Setting a trap
+with one form removes any trap of the other form for the same signal;
+removing a trap in either form removes all traps for the same signal.
+The forms
+
+
+ TRAPNAL() {
+ # code
+ }
+
+('function traps') and
+
+
+ trap '
+ # code
+ ' NAL
+
+('list traps') are equivalent in most ways, the exceptions being the
+following:
+
+
+ * Function traps have all the properties of normal functions,
+ appearing in the list of functions and being called with their own
+ function context rather than the context where the trap was
+ triggered.
+
+ * The return status from function traps is special, whereas a return
+ from a list trap causes the surrounding context to return with the
+ given status.
+
+ * Function traps are not reset within subshells, in accordance with
+ zsh behaviour; list traps are reset, in accordance with POSIX
+ behaviour.
+
+
+File: zsh.info, Node: Jobs & Signals, Next: Arithmetic Evaluation, Prev: Functions, Up: Top
+
+10 Jobs & Signals
+*****************
+
+
+
+10.1 Jobs
+=========
+
+If the MONITOR option is set, an interactive shell associates a _job_
+with each pipeline. It keeps a table of current jobs, printed by the
+jobs command, and assigns them small integer numbers. When a job is
+started asynchronously with `&', the shell prints a line to standard
+error which looks like:
+
+
+ [1] 1234
+
+indicating that the job which was started asynchronously was job number
+1 and had one (top-level) process, whose process ID was 1234.
+
+If a job is started with `&|' or `&!', then that job is immediately
+disowned. After startup, it does not have a place in the job table,
+and is not subject to the job control features described here.
+
+If you are running a job and wish to do something else you may hit the
+key ^Z (control-Z) which sends a TSTP signal to the current job: this
+key may be redefined by the susp option of the external stty command. The
+shell will then normally indicate that the job has been `suspended',
+and print another prompt. You can then manipulate the state of this
+job, putting it in the background with the bg command, or run some other
+commands and then eventually bring the job back into the foreground with the
+foreground command fg. A ^Z takes effect immediately and is like an
+interrupt in that pending output and unread input are discarded when it
+is typed.
+
+A job being run in the background will suspend if it tries to read from
+the terminal.
+
+Note that if the job running in the foreground is a shell function,
+then suspending it will have the effect of causing the shell to fork.
+This is necessary to separate the function's state from that of the
+parent shell performing the job control, so that the latter can return
+to the command line prompt. As a result, even if fg is used to
+continue the job the function will no longer be part of the parent
+shell, and any variables set by the function will not be visible in the
+parent shell. Thus the behaviour is different from the case where the
+function was never suspended. Zsh is different from many other shells
+in this regard.
+
+One additional side effect is that use of disown with a job created by
+suspending shell code in this fashion is delayed: the job can only be
+disowned once any process started from the parent shell has terminated.
+At that point, the disowned job disappears silently from the job list.
+
+The same behaviour is found when the shell is executing code as the
+right hand side of a pipeline or any complex shell construct such as
+if, for, etc., in order that the entire block of code can be managed as
+a single job. Background jobs are normally allowed to produce output,
+but this can be disabled by giving the command `stty tostop'. If you
+set this tty option, then background jobs will suspend when they try to
+produce output like they do when they try to read input.
+
+When a command is suspended and continued later with the fg or wait
+builtins, zsh restores tty modes that were in effect when it was
+suspended. This (intentionally) does not apply if the command is
+continued via `kill -CONT', nor when it is continued with bg.
+
+There are several ways to refer to jobs in the shell. A job can be
+referred to by the process ID of any process of the job or by one of
+the following:
+
+
+%NUMBER
+ The job with the given number.
+
+%STRING
+ The last job whose command line begins with STRING.
+
+%?STRING
+ The last job whose command line contains STRING.
+
+%%
+ Current job.
+
+%+
+ Equivalent to `%%'.
+
+%-
+ Previous job.
+
+The shell learns immediately whenever a process changes state. It
+normally informs you whenever a job becomes blocked so that no further
+progress is possible. If the NOTIFY option is not set, it waits until
+just before it prints a prompt before it informs you. All such
+notifications are sent directly to the terminal, not to the standard
+output or standard error.
+
+When the monitor mode is on, each background job that completes
+triggers any trap set for CHLD.
+
+When you try to leave the shell while jobs are running or suspended,
+you will be warned that `You have suspended (running) jobs'. You may
+use the jobs command to see what they are. If you do this or
+immediately try to exit again, the shell will not warn you a second
+time; the suspended jobs will be terminated, and the running jobs will
+be sent a SIGHUP signal, if the HUP option is set.
+
+To avoid having the shell terminate the running jobs, either use the
+`nohup' command (see man page nohup(1)) or the disown builtin.
+
+10.2 Signals
+============
+
+The INT and QUIT signals for an invoked command are ignored if the
+command is followed by `&' and the MONITOR option is not active. The
+shell itself always ignores the QUIT signal. Otherwise, signals have
+the values inherited by the shell from its parent (but see the TRAPNAL
+special functions in *Note Functions::).
+
+Certain jobs are run asynchronously by the shell other than those
+explicitly put into the background; even in cases where the shell would
+usually wait for such jobs, an explicit exit command or exit due to the
+option ERR_EXIT will cause the shell to exit without waiting. Examples
+of such asynchronous jobs are process substitution, see *Note Process
+Substitution::, and the handler processes for multios, see the section
+Multios in *Note Redirection::.
+
+
+File: zsh.info, Node: Arithmetic Evaluation, Next: Conditional Expressions, Prev: Jobs & Signals, Up: Top
+
+11 Arithmetic Evaluation
+************************
+
+The shell can perform integer and floating point arithmetic, either
+using the builtin let, or via a substitution of the form $((...)). For
+integers, the shell is usually compiled to use 8-byte precision where
+this is available, otherwise precision is 4 bytes. This can be tested,
+for example, by giving the command `print - $(( 12345678901 ))'; if the
+number appears unchanged, the precision is at least 8 bytes. Floating
+point arithmetic always uses the `double' type with whatever
+corresponding precision is provided by the compiler and the library.
+
+The let builtin command takes arithmetic expressions as arguments; each
+is evaluated separately. Since many of the arithmetic operators, as
+well as spaces, require quoting, an alternative form is provided: for
+any command which begins with a `((', all the characters until a
+matching `))' are treated as a quoted expression and arithmetic
+expansion performed as for an argument of let. More precisely,
+`((...))' is equivalent to `let "..."'. The return status is 0 if the
+arithmetic value of the expression is non-zero, 1 if it is zero, and 2
+if an error occurred.
+
+For example, the following statement
+
+
+ (( val = 2 + 1 ))
+
+is equivalent to
+
+
+ let "val = 2 + 1"
+
+both assigning the value 3 to the shell variable val and returning a
+zero status.
+
+Integers can be in bases other than 10. A leading `0x' or `0X' denotes
+hexadecimal and a leading `0b' or `0B' binary. Integers may also be of
+the form `BASE#N', where BASE is a decimal number between two and
+thirty-six representing the arithmetic base and N is a number in that
+base (for example, `16#ff' is 255 in hexadecimal). The BASE# may also
+be omitted, in which case base 10 is used. For backwards compatibility
+the form `[BASE]N' is also accepted.
+
+An integer expression or a base given in the form `BASE#N' may contain
+underscores (`_') after the leading digit for visual guidance; these
+are ignored in computation. Examples are 1_000_000 or 0xffff_ffff
+which are equivalent to 1000000 and 0xffffffff respectively.
+
+It is also possible to specify a base to be used for output in the form
+`[#BASE]', for example `[#16]'. This is used when outputting
+arithmetical substitutions or when assigning to scalar parameters, but
+an explicitly defined integer or floating point parameter will not be
+affected. If an integer variable is implicitly defined by an
+arithmetic expression, any base specified in this way will be set as the
+variable's output arithmetic base as if the option `-i BASE' to the
+typeset builtin had been used. The expression has no precedence and if
+it occurs more than once in a mathematical expression, the last
+encountered is used. For clarity it is recommended that it appear at
+the beginning of an expression. As an example:
+
+
+ typeset -i 16 y
+ print $(( [#8] x = 32, y = 32 ))
+ print $x $y
+
+outputs first `8#40', the rightmost value in the given output base, and
+then `8#40 16#20', because y has been explicitly declared to have
+output base 16, while x (assuming it does not already exist) is
+implicitly typed by the arithmetic evaluation, where it acquires the
+output base 8.
+
+The BASE may be replaced or followed by an underscore, which may itself
+be followed by a positive integer (if it is missing the value 3 is
+used). This indicates that underscores should be inserted into the
+output string, grouping the number for visual clarity. The following
+integer specifies the number of digits to group together. For example:
+
+
+ setopt cbases
+ print $(( [#16_4] 65536 ** 2 ))
+
+outputs `0x1_0000_0000'.
+
+The feature can be used with floating point numbers, in which case the
+base must be omitted; grouping is away from the decimal point. For
+example,
+
+
+ zmodload zsh/mathfunc
+ print $(( [#_] sqrt(1e7) ))
+
+outputs `3_162.277_660_168_379_5' (the number of decimal places shown
+may vary).
+
+If the C_BASES option is set, hexadecimal numbers are output in the
+standard C format, for example `0xFF' instead of the usual `16#FF'. If
+the option OCTAL_ZEROES is also set (it is not by default), octal
+numbers will be treated similarly and hence appear as `077' instead of
+`8#77'. This option has no effect on the output of bases other than
+hexadecimal and octal, and these formats are always understood on input.
+
+When an output base is specified using the `[#BASE]' syntax, an
+appropriate base prefix will be output if necessary, so that the value
+output is valid syntax for input. If the # is doubled, for example
+`[##16]', then no base prefix is output.
+
+Floating point constants are recognized by the presence of a decimal
+point or an exponent. The decimal point may be the first character of
+the constant, but the exponent character e or E may not, as it will be
+taken for a parameter name. All numeric parts (before and after the
+decimal point and in the exponent) may contain underscores after the
+leading digit for visual guidance; these are ignored in computation.
+
+An arithmetic expression uses nearly the same syntax and associativity
+of expressions as in C.
+
+In the native mode of operation, the following operators are supported
+(listed in decreasing order of precedence):
+
+
++ - ! ~ ++ -
+ unary plus/minus, logical NOT, complement, {pre,post}{in,de}crement
+
+<< >>
+ bitwise shift left, right
+
+&
+ bitwise AND
+
+^
+ bitwise XOR
+
+|
+ bitwise OR
+
+**
+ exponentiation
+
+* / %
+ multiplication, division, modulus (remainder)
+
++ -
+ addition, subtraction
+
+< > <= >=
+ comparison
+
+== !=
+ equality and inequality
+
+&&
+ logical AND
+
+|| ^^
+ logical OR, XOR
+
+? :
+ ternary operator
+
+= += -= *= /= %= &= ^= |= <<= >>= &&= ||= ^^= **=
+ assignment
+
+,
+ comma operator
+
+The operators `&&', `||', `&&=', and `||=' are short-circuiting, and
+only one of the latter two expressions in a ternary operator is
+evaluated. Note the precedence of the bitwise AND, OR, and XOR
+operators.
+
+With the option C_PRECEDENCES the precedences (but no other properties)
+of the operators are altered to be the same as those in most other
+languages that support the relevant operators:
+
+
++ - ! ~ ++ -
+ unary plus/minus, logical NOT, complement, {pre,post}{in,de}crement
+
+**
+ exponentiation
+
+* / %
+ multiplication, division, modulus (remainder)
+
++ -
+ addition, subtraction
+
+<< >>
+ bitwise shift left, right
+
+< > <= >=
+ comparison
+
+== !=
+ equality and inequality
+
+&
+ bitwise AND
+
+^
+ bitwise XOR
+
+|
+ bitwise OR
+
+&&
+ logical AND
+
+^^
+ logical XOR
+
+||
+ logical OR
+
+? :
+ ternary operator
+
+= += -= *= /= %= &= ^= |= <<= >>= &&= ||= ^^= **=
+ assignment
+
+,
+ comma operator
+
+Note the precedence of exponentiation in both cases is below that of
+unary operators, hence `-3**2' evaluates as `9', not `-9'. Use
+parentheses where necessary: `-(3**2)'. This is for compatibility with
+other shells.
+
+Mathematical functions can be called with the syntax `FUNC(ARGS)',
+where the function decides if the ARGS is used as a string or a
+comma-separated list of arithmetic expressions. The shell currently
+defines no mathematical functions by default, but the module
+zsh/mathfunc may be loaded with the zmodload builtin to provide
+standard floating point mathematical functions.
+
+An expression of the form `##X' where X is any character sequence such
+as `a', `^A', or `\M-\C-x' gives the value of this character and an
+expression of the form `#NAME' gives the value of the first character
+of the contents of the parameter NAME. Character values are according
+to the character set used in the current locale; for multibyte
+character handling the option MULTIBYTE must be set. Note that this
+form is different from `$#NAME', a standard parameter substitution
+which gives the length of the parameter NAME. `#\' is accepted instead
+of `##', but its use is deprecated.
+
+Named parameters and subscripted arrays can be referenced by name
+within an arithmetic expression without using the parameter expansion
+syntax. For example,
+
+
+ ((val2 = val1 * 2))
+
+assigns twice the value of $val1 to the parameter named val2.
+
+An internal integer representation of a named parameter can be
+specified with the integer builtin. Arithmetic evaluation is performed
+on the value of each assignment to a named parameter declared integer
+in this manner. Assigning a floating point number to an integer
+results in rounding towards zero.
+
+Likewise, floating point numbers can be declared with the float
+builtin; there are two types, differing only in their output format, as
+described for the typeset builtin. The output format can be bypassed
+by using arithmetic substitution instead of the parameter substitution,
+i.e. `${FLOAT}' uses the defined format, but `$((FLOAT))' uses a
+generic floating point format.
+
+Promotion of integer to floating point values is performed where
+necessary. In addition, if any operator which requires an integer
+(`&', `|', `^', `<<', `>>' and their equivalents with assignment) is
+given a floating point argument, it will be silently rounded towards
+zero except for `~' which rounds down.
+
+Users should beware that, in common with many other programming
+languages but not software designed for calculation, the evaluation of
+an expression in zsh is taken a term at a time and promotion of integers
+to floating point does not occur in terms only containing integers. A
+typical result of this is that a division such as 6/8 is truncated, in
+this being rounded towards 0. The FORCE_FLOAT shell option can be used
+in scripts or functions where floating point evaluation is required
+throughout.
+
+Scalar variables can hold integer or floating point values at different
+times; there is no memory of the numeric type in this case.
+
+If a variable is first assigned in a numeric context without previously
+being declared, it will be implicitly typed as integer or float and
+retain that type either until the type is explicitly changed or until
+the end of the scope. This can have unforeseen consequences. For
+example, in the loop
+
+
+ for (( f = 0; f < 1; f += 0.1 )); do
+ # use $f
+ done
+
+if f has not already been declared, the first assignment will cause it
+to be created as an integer, and consequently the operation `f += 0.1'
+will always cause the result to be truncated to zero, so that the loop
+will fail. A simple fix would be to turn the initialization into `f =
+0.0'. It is therefore best to declare numeric variables with explicit
+types.
+
+
+File: zsh.info, Node: Conditional Expressions, Next: Prompt Expansion, Prev: Arithmetic Evaluation, Up: Top
+
+12 Conditional Expressions
+**************************
+
+A _conditional expression_ is used with the [[ compound command to test
+attributes of files and to compare strings. Each expression can be
+constructed from one or more of the following unary or binary
+expressions:
+
+
+-a FILE
+ true if FILE exists.
+
+-b FILE
+ true if FILE exists and is a block special file.
+
+-c FILE
+ true if FILE exists and is a character special file.
+
+-d FILE
+ true if FILE exists and is a directory.
+
+-e FILE
+ true if FILE exists.
+
+-f FILE
+ true if FILE exists and is a regular file.
+
+-g FILE
+ true if FILE exists and has its setgid bit set.
+
+-h FILE
+ true if FILE exists and is a symbolic link.
+
+-k FILE
+ true if FILE exists and has its sticky bit set.
+
+-n STRING
+ true if length of STRING is non-zero.
+
+-o OPTION
+ true if option named OPTION is on. OPTION may be a single
+ character, in which case it is a single letter option name. (See
+ *Note Specifying Options::.)
+
+ When no option named OPTION exists, and the POSIX_BUILTINS option
+ hasn't been set, return 3 with a warning. If that option is set,
+ return 1 with no warning.
+
+-p FILE
+ true if FILE exists and is a FIFO special file (named pipe).
+
+-r FILE
+ true if FILE exists and is readable by current process.
+
+-s FILE
+ true if FILE exists and has size greater than zero.
+
+-t FD
+ true if file descriptor number FD is open and associated with a
+ terminal device. (note: FD is not optional)
+
+-u FILE
+ true if FILE exists and has its setuid bit set.
+
+-v VARNAME
+ true if shell variable VARNAME is set.
+
+-w FILE
+ true if FILE exists and is writable by current process.
+
+-x FILE
+ true if FILE exists and is executable by current process. If FILE
+ exists and is a directory, then the current process has permission
+ to search in the directory.
+
+-z STRING
+ true if length of STRING is zero.
+
+-L FILE
+ true if FILE exists and is a symbolic link.
+
+-O FILE
+ true if FILE exists and is owned by the effective user ID of this
+ process.
+
+-G FILE
+ true if FILE exists and its group matches the effective group ID
+ of this process.
+
+-S FILE
+ true if FILE exists and is a socket.
+
+-N FILE
+ true if FILE exists and its access time is not newer than its
+ modification time.
+
+FILE1 -nt FILE2
+ true if FILE1 exists and is newer than FILE2.
+
+FILE1 -ot FILE2
+ true if FILE1 exists and is older than FILE2.
+
+FILE1 -ef FILE2
+ true if FILE1 and FILE2 exist and refer to the same file.
+
+STRING = PATTERN
+STRING == PATTERN
+ true if STRING matches PATTERN. The two forms are exactly
+ equivalent. The `=' form is the traditional shell syntax (and
+ hence the only one generally used with the test and [ builtins);
+ the `==' form provides compatibility with other sorts of computer
+ language.
+
+STRING != PATTERN
+ true if STRING does not match PATTERN.
+
+STRING =~ REGEXP
+ true if STRING matches the regular expression REGEXP. If the
+ option RE_MATCH_PCRE is set REGEXP is tested as a PCRE regular
+ expression using the zsh/pcre module, else it is tested as a POSIX
+ extended regular expression using the zsh/regex module. Upon
+ successful match, some variables will be updated; no variables are
+ changed if the matching fails.
+
+ If the option BASH_REMATCH is not set the scalar parameter MATCH
+ is set to the substring that matched the pattern and the integer
+ parameters MBEGIN and MEND to the index of the start and end,
+ respectively, of the match in STRING, such that if STRING is
+ contained in variable var the expression `${var[$MBEGIN,$MEND]}'
+ is identical to `$MATCH'. The setting of the option KSH_ARRAYS is
+ respected. Likewise, the array match is set to the substrings
+ that matched parenthesised subexpressions and the arrays mbegin
+ and mend to the indices of the start and end positions,
+ respectively, of the substrings within STRING. The arrays are not
+ set if there were no parenthesised subexpressions. For example,
+ if the string `a short string' is matched against the regular
+ expression `s(...)t', then (assuming the option KSH_ARRAYS is not
+ set) MATCH, MBEGIN and MEND are `short', 3 and 7, respectively,
+ while match, mbegin and mend are single entry arrays containing
+ the strings `hor', `4' and `6', respectively.
+
+ If the option BASH_REMATCH is set the array BASH_REMATCH is set to
+ the substring that matched the pattern followed by the substrings
+ that matched parenthesised subexpressions within the pattern.
+
+STRING1 < STRING2
+ true if STRING1 comes before STRING2 based on ASCII value of their
+ characters.
+
+STRING1 > STRING2
+ true if STRING1 comes after STRING2 based on ASCII value of their
+ characters.
+
+EXP1 -eq EXP2
+ true if EXP1 is numerically equal to EXP2. Note that for purely
+ numeric comparisons use of the ((...)) builtin described in *Note
+ Arithmetic Evaluation:: is more convenient than conditional
+ expressions.
+
+EXP1 -ne EXP2
+ true if EXP1 is numerically not equal to EXP2.
+
+EXP1 -lt EXP2
+ true if EXP1 is numerically less than EXP2.
+
+EXP1 -gt EXP2
+ true if EXP1 is numerically greater than EXP2.
+
+EXP1 -le EXP2
+ true if EXP1 is numerically less than or equal to EXP2.
+
+EXP1 -ge EXP2
+ true if EXP1 is numerically greater than or equal to EXP2.
+
+( EXP )
+ true if EXP is true.
+
+! EXP
+ true if EXP is false.
+
+EXP1 && EXP2
+ true if EXP1 and EXP2 are both true.
+
+EXP1 || EXP2
+ true if either EXP1 or EXP2 is true.
+
+
+For compatibility, if there is a single argument that is not
+syntactically significant, typically a variable, the condition is
+treated as a test for whether the expression expands as a string of
+non-zero length. In other words, [[ $var ]] is the same as [[ -n $var
+]]. It is recommended that the second, explicit, form be used where
+possible.
+
+Normal shell expansion is performed on the FILE, STRING and PATTERN
+arguments, but the result of each expansion is constrained to be a
+single word, similar to the effect of double quotes.
+
+Filename generation is not performed on any form of argument to
+conditions. However, it can be forced in any case where normal shell
+expansion is valid and when the option EXTENDED_GLOB is in effect by
+using an explicit glob qualifier of the form (#q) at the end of the
+string. A normal glob qualifier expression may appear between the `q'
+and the closing parenthesis; if none appears the expression has no
+effect beyond causing filename generation. The results of filename
+generation are joined together to form a single word, as with the
+results of other forms of expansion.
+
+This special use of filename generation is only available with the [[
+syntax. If the condition occurs within the [ or test builtin commands
+then globbing occurs instead as part of normal command line expansion
+before the condition is evaluated. In this case it may generate
+multiple words which are likely to confuse the syntax of the test
+command.
+
+For example,
+
+
+ [[ -n file*(#qN) ]]
+
+produces status zero if and only if there is at least one file in the
+current directory beginning with the string `file'. The globbing
+qualifier N ensures that the expression is empty if there is no
+matching file.
+
+Pattern metacharacters are active for the PATTERN arguments; the
+patterns are the same as those used for filename generation, see *Note
+Filename Generation::, but there is no special behaviour of `/' nor
+initial dots, and no glob qualifiers are allowed.
+
+In each of the above expressions, if FILE is of the form `/dev/fd/N',
+where N is an integer, then the test applied to the open file whose
+descriptor number is N, even if the underlying system does not support
+the /dev/fd directory.
+
+In the forms which do numeric comparison, the expressions EXP undergo
+arithmetic expansion as if they were enclosed in $((...)).
+
+For example, the following:
+
+
+ [[ ( -f foo || -f bar ) && $report = y* ]] && print File exists.
+
+tests if either file foo or file bar exists, and if so, if the value of
+the parameter report begins with `y'; if the complete condition is
+true, the message `File exists.' is printed.
+
+
+File: zsh.info, Node: Prompt Expansion, Next: Expansion, Prev: Conditional Expressions, Up: Top
+
+13 Prompt Expansion
+*******************
+
+
+
+13.1 Expansion of Prompt Sequences
+==================================
+
+Prompt sequences undergo a special form of expansion. This type of
+expansion is also available using the -P option to the print builtin.
+
+If the PROMPT_SUBST option is set, the prompt string is first subjected
+to _parameter expansion_, _command substitution_ and _arithmetic
+expansion_. See *Note Expansion::.
+
+Certain escape sequences may be recognised in the prompt string.
+
+If the PROMPT_BANG option is set, a `!' in the prompt is replaced by
+the current history event number. A literal `!' may then be
+represented as `!!'.
+
+If the PROMPT_PERCENT option is set, certain escape sequences that
+start with `%' are expanded. Many escapes are followed by a single
+character, although some of these take an optional integer argument that
+should appear between the `%' and the next character of the sequence.
+More complicated escape sequences are available to provide conditional
+expansion.
+
+
+
+13.2 Simple Prompt Escapes
+==========================
+
+
+
+13.2.1 Special characters
+-------------------------
+
+
+%%
+ A `%'.
+
+%)
+ A `)'.
+
+
+
+13.2.2 Login information
+------------------------
+
+
+%l
+ The line (tty) the user is logged in on, without `/dev/' prefix.
+ If the name starts with `/dev/tty', that prefix is stripped.
+
+%M
+ The full machine hostname.
+
+%m
+ The hostname up to the first `.'. An integer may follow the `%'
+ to specify how many components of the hostname are desired. With
+ a negative integer, trailing components of the hostname are shown.
+
+%n
+ $USERNAME.
+
+%y
+ The line (tty) the user is logged in on, without `/dev/' prefix.
+ This does not treat `/dev/tty' names specially.
+
+
+
+13.2.3 Shell state
+------------------
+
+
+%#
+ A `#' if the shell is running with privileges, a `%' if not.
+ Equivalent to `%(!.#.%%)'. The definition of `privileged', for
+ these purposes, is that either the effective user ID is zero, or,
+ if POSIX.1e capabilities are supported, that at least one
+ capability is raised in either the Effective or Inheritable
+ capability vectors.
+
+%?
+ The return status of the last command executed just before the
+ prompt.
+
+%_
+ The status of the parser, i.e. the shell constructs (like `if' and
+ `for') that have been started on the command line. If given an
+ integer number that many strings will be printed; zero or negative
+ or no integer means print as many as there are. This is most
+ useful in prompts PS2 for continuation lines and PS4 for debugging
+ with the XTRACE option; in the latter case it will also work
+ non-interactively.
+
+%^
+ The status of the parser in reverse. This is the same as `%_'
+ other than the order of strings. It is often used in RPS2.
+
+%d
+%/
+ Current working directory. If an integer follows the `%', it
+ specifies a number of trailing components of the current working
+ directory to show; zero means the whole path. A negative integer
+ specifies leading components, i.e. %-1d specifies the first
+ component.
+
+%~
+ As %d and %/, but if the current working directory starts with
+ $HOME, that part is replaced by a `~'. Furthermore, if it has a
+ named directory as its prefix, that part is replaced by a `~'
+ followed by the name of the directory, but only if the result is
+ shorter than the full path; *Note Filename Expansion::.
+
+%e
+ Evaluation depth of the current sourced file, shell function, or
+ eval. This is incremented or decremented every time the value of
+ %N is set or reverted to a previous value, respectively. This is
+ most useful for debugging as part of $PS4.
+
+%h
+%!
+ Current history event number.
+
+%i
+ The line number currently being executed in the script, sourced
+ file, or shell function given by %N. This is most useful for
+ debugging as part of $PS4.
+
+%I
+ The line number currently being executed in the file %x. This is
+ similar to %i, but the line number is always a line number in the
+ file where the code was defined, even if the code is a shell
+ function.
+
+%j
+ The number of jobs.
+
+%L
+ The current value of $SHLVL.
+
+%N
+ The name of the script, sourced file, or shell function that zsh is
+ currently executing, whichever was started most recently. If
+ there is none, this is equivalent to the parameter $0. An integer
+ may follow the `%' to specify a number of trailing path components
+ to show; zero means the full path. A negative integer specifies
+ leading components.
+
+%x
+ The name of the file containing the source code currently being
+ executed. This behaves as %N except that function and eval command
+ names are not shown, instead the file where they were defined.
+
+%c
+%.
+%C
+ Trailing component of the current working directory. An integer
+ may follow the `%' to get more than one component. Unless `%C' is
+ used, tilde contraction is performed first. These are deprecated
+ as %c and %C are equivalent to %1~ and %1/, respectively, while
+ explicit positive integers have the same effect as for the latter
+ two sequences.
+
+
+
+13.2.4 Date and time
+--------------------
+
+
+%D
+ The date in YY-MM-DD format.
+
+%T
+ Current time of day, in 24-hour format.
+
+%t
+%@
+ Current time of day, in 12-hour, am/pm format.
+
+%*
+ Current time of day in 24-hour format, with seconds.
+
+%w
+ The date in DAY-DD format.
+
+%W
+ The date in MM/DD/YY format.
+
+%D{STRING}
+ STRING is formatted using the strftime function. See man page
+ strftime(3) for more details. Various zsh extensions provide
+ numbers with no leading zero or space if the number is a single
+ digit:
+
+
+ %f
+ a day of the month
+
+ %K
+ the hour of the day on the 24-hour clock
+
+ %L
+ the hour of the day on the 12-hour clock
+
+ In addition, if the system supports the POSIX gettimeofday system
+ call, %. provides decimal fractions of a second since the epoch
+ with leading zeroes. By default three decimal places are
+ provided, but a number of digits up to 9 may be given following
+ the %; hence %6. outputs microseconds, and %9. outputs
+ nanoseconds. (The latter requires a nanosecond-precision
+ clock_gettime; systems lacking this will return a value multiplied
+ by the appropriate power of 10.) A typical example of this is the
+ format `%D{%H:%M:%S.%.}'.
+
+ The GNU extension %N is handled as a synonym for %9..
+
+ Additionally, the GNU extension that a `-' between the % and the
+ format character causes a leading zero or space to be stripped is
+ handled directly by the shell for the format characters d, f, H,
+ k, l, m, M, S and y; any other format characters are provided to
+ the system's strftime(3) with any leading `-' present, so the
+ handling is system dependent. Further GNU (or other) extensions
+ are also passed to strftime(3) and may work if the system supports
+ them.
+
+
+
+13.2.5 Visual effects
+---------------------
+
+
+%B (%b)
+ Start (stop) boldface mode.
+
+%E
+ Clear to end of line.
+
+%U (%u)
+ Start (stop) underline mode.
+
+%S (%s)
+ Start (stop) standout mode.
+
+%F (%f)
+ Start (stop) using a different foreground colour, if supported by
+ the terminal. The colour may be specified two ways: either as a
+ numeric argument, as normal, or by a sequence in braces following
+ the %F, for example %F{red}. In the latter case the values
+ allowed are as described for the fg zle_highlight attribute; *Note
+ Character Highlighting::. This means that numeric colours are
+ allowed in the second format also.
+
+%K (%k)
+ Start (stop) using a different bacKground colour. The syntax is
+ identical to that for %F and %f.
+
+%{...%}
+ Include a string as a literal escape sequence. The string within
+ the braces should not change the cursor position. Brace pairs can
+ nest.
+
+ A positive numeric argument between the % and the { is treated as
+ described for %G below.
+
+%G
+ Within a %{...%} sequence, include a `glitch': that is, assume
+ that a single character width will be output. This is useful when
+ outputting characters that otherwise cannot be correctly handled
+ by the shell, such as the alternate character set on some
+ terminals. The characters in question can be included within a
+ %{...%} sequence together with the appropriate number of %G
+ sequences to indicate the correct width. An integer between the
+ `%' and `G' indicates a character width other than one. Hence
+ %{SEQ%2G%} outputs SEQ and assumes it takes up the width of two
+ standard characters.
+
+ Multiple uses of %G accumulate in the obvious fashion; the position
+ of the %G is unimportant. Negative integers are not handled.
+
+ Note that when prompt truncation is in use it is advisable to
+ divide up output into single characters within each %{...%} group
+ so that the correct truncation point can be found.
+
+
+
+13.3 Conditional Substrings in Prompts
+======================================
+
+
+%v
+ The value of the first element of the psvar array parameter.
+ Following the `%' with an integer gives that element of the array.
+ Negative integers count from the end of the array.
+
+%(X.TRUE-TEXT.FALSE-TEXT)
+ Specifies a ternary expression. The character following the X is
+ arbitrary; the same character is used to separate the text for the
+ `true' result from that for the `false' result. This separator
+ may not appear in the TRUE-TEXT, except as part of a %-escape
+ sequence. A `)' may appear in the FALSE-TEXT as `%)'. TRUE-TEXT
+ and FALSE-TEXT may both contain arbitrarily-nested escape
+ sequences, including further ternary expressions.
+
+ The left parenthesis may be preceded or followed by a positive
+ integer N, which defaults to zero. A negative integer will be
+ multiplied by -1, except as noted below for `l'. The test
+ character X may be any of the following:
+
+
+ !
+ True if the shell is running with privileges.
+
+ #
+ True if the effective uid of the current process is N.
+
+ ?
+ True if the exit status of the last command was N.
+
+ _
+ True if at least N shell constructs were started.
+
+ C
+ /
+ True if the current absolute path has at least N elements
+ relative to the root directory, hence / is counted as 0
+ elements.
+
+ c
+ .
+ ~
+ True if the current path, with prefix replacement, has at
+ least N elements relative to the root directory, hence / is
+ counted as 0 elements.
+
+ D
+ True if the month is equal to N (January = 0).
+
+ d
+ True if the day of the month is equal to N.
+
+ e
+ True if the evaluation depth is at least N.
+
+ g
+ True if the effective gid of the current process is N.
+
+ j
+ True if the number of jobs is at least N.
+
+ L
+ True if the SHLVL parameter is at least N.
+
+ l
+ True if at least N characters have already been printed on
+ the current line. When N is negative, true if at least
+ abs(N) characters remain before the opposite margin (thus the
+ left margin for RPROMPT).
+
+ S
+ True if the SECONDS parameter is at least N.
+
+ T
+ True if the time in hours is equal to N.
+
+ t
+ True if the time in minutes is equal to N.
+
+ v
+ True if the array psvar has at least N elements.
+
+ V
+ True if element N of the array psvar is set and non-empty.
+
+ w
+ True if the day of the week is equal to N (Sunday = 0).
+
+%<STRING<
+%>STRING>
+%[XSTRING]
+ Specifies truncation behaviour for the remainder of the prompt
+ string. The third, deprecated, form is equivalent to `%XSTRINGX',
+ i.e. X may be `<' or `>'. The STRING will be displayed in place
+ of the truncated portion of any string; note this does not undergo
+ prompt expansion.
+
+ The numeric argument, which in the third form may appear
+ immediately after the `[', specifies the maximum permitted length
+ of the various strings that can be displayed in the prompt. In
+ the first two forms, this numeric argument may be negative, in
+ which case the truncation length is determined by subtracting the
+ absolute value of the numeric argument from the number of
+ character positions remaining on the current prompt line. If this
+ results in a zero or negative length, a length of 1 is used. In
+ other words, a negative argument arranges that after truncation at
+ least N characters remain before the right margin (left margin for
+ RPROMPT).
+
+ The forms with `<' truncate at the left of the string, and the
+ forms with `>' truncate at the right of the string. For example,
+ if the current directory is `/home/pike', the prompt `%8<..<%/'
+ will expand to `..e/pike'. In this string, the terminating
+ character (`<', `>' or `]'), or in fact any character, may be
+ quoted by a preceding `\'; note when using print -P, however, that
+ this must be doubled as the string is also subject to standard
+ print processing, in addition to any backslashes removed by a
+ double quoted string: the worst case is therefore `print -P
+ "%<\\\\<<..."'.
+
+ If the STRING is longer than the specified truncation length, it
+ will appear in full, completely replacing the truncated string.
+
+ The part of the prompt string to be truncated runs to the end of
+ the string, or to the end of the next enclosing group of the `%('
+ construct, or to the next truncation encountered at the same
+ grouping level (i.e. truncations inside a `%(' are separate), which
+ ever comes first. In particular, a truncation with argument zero
+ (e.g., `%<<') marks the end of the range of the string to be
+ truncated while turning off truncation from there on. For example,
+ the prompt `%10<...<%~%<<%# ' will print a truncated
+ representation of the current directory, followed by a `%' or `#',
+ followed by a space. Without the `%<<', those two characters
+ would be included in the string to be truncated. Note that
+ `%-0<<' is not equivalent to `%<<' but specifies that the prompt
+ is truncated at the right margin.
+
+ Truncation applies only within each individual line of the prompt,
+ as delimited by embedded newlines (if any). If the total length
+ of any line of the prompt after truncation is greater than the
+ terminal width, or if the part to be truncated contains embedded
+ newlines, truncation behavior is undefined and may change in a
+ future version of the shell. Use `%-N(l.TRUE-TEXT.FALSE-TEXT)' to
+ remove parts of the prompt when the available space is less than N.
+
+
+
+File: zsh.info, Node: Expansion, Next: Parameters, Prev: Prompt Expansion, Up: Top
+
+14 Expansion
+************
+
+The following types of expansions are performed in the indicated order
+in five steps:
+
+
+_History Expansion_
+ This is performed only in interactive shells.
+
+_Alias Expansion_
+ Aliases are expanded immediately before the command line is parsed
+ as explained in *Note Aliasing::.
+
+_Process Substitution_
+_Parameter Expansion_
+_Command Substitution_
+_Arithmetic Expansion_
+_Brace Expansion_
+ These five are performed in left-to-right fashion. On each
+ argument, any of the five steps that are needed are performed one
+ after the other. Hence, for example, all the parts of parameter
+ expansion are completed before command substitution is started.
+ After these expansions, all unquoted occurrences of the characters
+ `\',`'' and `"' are removed.
+
+_Filename Expansion_
+ If the SH_FILE_EXPANSION option is set, the order of expansion is
+ modified for compatibility with `sh' and `ksh'. In that case
+ _filename expansion_ is performed immediately after _alias
+ expansion_, preceding the set of five expansions mentioned above.
+
+_Filename Generation_
+ This expansion, commonly referred to as `globbing', is always done
+ last.
+
+
+The following sections explain the types of expansion in detail.
+
+
+
+* Menu:
+
+* History Expansion::
+* Process Substitution::
+* Parameter Expansion::
+* Command Substitution::
+* Arithmetic Expansion::
+* Brace Expansion::
+* Filename Expansion::
+* Filename Generation::
+
+
+File: zsh.info, Node: History Expansion, Next: Process Substitution, Up: Expansion
+
+14.1 History Expansion
+======================
+
+History expansion allows you to use words from previous command lines
+in the command line you are typing. This simplifies spelling
+corrections and the repetition of complicated commands or arguments.
+
+Immediately before execution, each command is saved in the history list,
+the size of which is controlled by the HISTSIZE parameter. The one
+most recent command is always retained in any case. Each saved command
+in the history list is called a history _event_ and is assigned a
+number, beginning with 1 (one) when the shell starts up. The history
+number that you may see in your prompt (see *Note Prompt Expansion::)
+is the number that is to be assigned to the _next_ command.
+
+
+
+* Menu:
+
+* Overview::
+* Event Designators::
+* Word Designators::
+* Modifiers::
+
+
+File: zsh.info, Node: Overview, Next: Event Designators, Up: History Expansion
+
+14.1.1 Overview
+---------------
+
+A history expansion begins with the first character of the histchars
+parameter, which is `!' by default, and may occur anywhere on the
+command line, including inside double quotes (but not inside single
+quotes '...' or C-style quotes $'...' nor when escaped with a
+backslash).
+
+The first character is followed by an optional event designator (*Note
+Event Designators::) and then an optional word designator (*Note Word
+Designators::); if neither of these designators is present, no history
+expansion occurs.
+
+Input lines containing history expansions are echoed after being
+expanded, but before any other expansions take place and before the
+command is executed. It is this expanded form that is recorded as the
+history event for later references.
+
+History expansions do not nest.
+
+By default, a history reference with no event designator refers to the
+same event as any preceding history reference on that command line; if
+it is the only history reference in a command, it refers to the previous
+command. However, if the option CSH_JUNKIE_HISTORY is set, then every
+history reference with no event specification _always_ refers to the
+previous command.
+
+For example, `!' is the event designator for the previous command, so
+`!!:1' always refers to the first word of the previous command, and
+`!!$' always refers to the last word of the previous command. With
+CSH_JUNKIE_HISTORY set, then `!:1' and `!$' function in the same manner
+as `!!:1' and `!!$', respectively. Conversely, if CSH_JUNKIE_HISTORY
+is unset, then `!:1' and `!$' refer to the first and last words,
+respectively, of the same event referenced by the nearest other history
+reference preceding them on the current command line, or to the
+previous command if there is no preceding reference.
+
+The character sequence `^FOO^BAR' (where `^' is actually the second
+character of the histchars parameter) repeats the last command,
+replacing the string FOO with BAR. More precisely, the sequence
+`^FOO^BAR^' is synonymous with `!!:s^FOO^BAR^', hence other modifiers
+(see *Note Modifiers::) may follow the final `^'. In particular,
+`^FOO^BAR^:G' performs a global substitution.
+
+If the shell encounters the character sequence `!"' in the input, the
+history mechanism is temporarily disabled until the current list (see
+*Note Shell Grammar::) is fully parsed. The `!"' is removed from the
+input, and any subsequent `!' characters have no special significance.
+
+A less convenient but more comprehensible form of command history
+support is provided by the fc builtin.
+
+
+File: zsh.info, Node: Event Designators, Next: Word Designators, Prev: Overview, Up: History Expansion
+
+14.1.2 Event Designators
+------------------------
+
+An event designator is a reference to a command-line entry in the
+history list. In the list below, remember that the initial `!' in each
+item may be changed to another character by setting the histchars
+parameter.
+
+
+!
+ Start a history expansion, except when followed by a blank,
+ newline, `=' or `('. If followed immediately by a word designator
+ (*Note Word Designators::), this forms a history reference with no
+ event designator (*Note Overview::).
+
+!!
+ Refer to the previous command. By itself, this expansion repeats
+ the previous command.
+
+!N
+ Refer to command-line N.
+
+!-N
+ Refer to the current command-line minus N.
+
+!STR
+ Refer to the most recent command starting with STR.
+
+!?STR[?]
+ Refer to the most recent command containing STR. The trailing `?'
+ is necessary if this reference is to be followed by a modifier or
+ followed by any text that is not to be considered part of STR.
+
+!#
+ Refer to the current command line typed in so far. The line is
+ treated as if it were complete up to and including the word before
+ the one with the `!#' reference.
+
+!{...}
+ Insulate a history reference from adjacent characters (if
+ necessary).
+
+
+
+File: zsh.info, Node: Word Designators, Next: Modifiers, Prev: Event Designators, Up: History Expansion
+
+14.1.3 Word Designators
+-----------------------
+
+A word designator indicates which word or words of a given command line
+are to be included in a history reference. A `:' usually separates the
+event specification from the word designator. It may be omitted only
+if the word designator begins with a `^', `$', `*', `-' or `%'. Word
+designators include:
+
+
+0
+ The first input word (command).
+
+N
+ The Nth argument.
+
+^
+ The first argument. That is, 1.
+
+$
+ The last argument.
+
+%
+ The word matched by (the most recent) ?STR search.
+
+X-Y
+ A range of words; X defaults to 0.
+
+*
+ All the arguments, or a null value if there are none.
+
+X*
+ Abbreviates `X-$'.
+
+X-
+ Like `X*' but omitting word $.
+
+Note that a `%' word designator works only when used in one of `!%',
+`!:%' or `!?STR?:%', and only when used after a !? expansion (possibly
+in an earlier command). Anything else results in an error, although
+the error may not be the most obvious one.
+
+
+File: zsh.info, Node: Modifiers, Prev: Word Designators, Up: History Expansion
+
+14.1.4 Modifiers
+----------------
+
+After the optional word designator, you can add a sequence of one or
+more of the following modifiers, each preceded by a `:'. These
+modifiers also work on the result of _filename generation_ and
+_parameter expansion_, except where noted.
+
+
+a
+ Turn a file name into an absolute path: prepends the current
+ directory, if necessary; remove `.' path segments; and remove `..'
+ path segments and the segments that immediately precede them.
+
+ This transformation is agnostic about what is in the filesystem,
+ i.e. is on the logical, not the physical directory. It takes
+ place in the same manner as when changing directories when neither
+ of the options CHASE_DOTS or CHASE_LINKS is set. For example,
+ `/before/here/../after' is always transformed to `/before/after',
+ regardless of whether `/before/here' exists or what kind of object
+ (dir, file, symlink, etc.) it is.
+
+A
+ Turn a file name into an absolute path as the `a' modifier does,
+ and _then_ pass the result through the realpath(3) library
+ function to resolve symbolic links.
+
+ Note: on systems that do not have a realpath(3) library function,
+ symbolic links are not resolved, so on those systems `a' and `A'
+ are equivalent.
+
+ Note: foo:A and realpath(foo) are different on some inputs. For
+ realpath(foo) semantics, see the `P` modifier.
+
+c
+ Resolve a command name into an absolute path by searching the
+ command path given by the PATH variable. This does not work for
+ commands containing directory parts. Note also that this does not
+ usually work as a glob qualifier unless a file of the same name is
+ found in the current directory.
+
+e
+ Remove all but the part of the filename extension following the
+ `.'; see the definition of the filename extension in the
+ description of the r modifier below. Note that according to that
+ definition the result will be empty if the string ends with a `.'.
+
+h [ DIGITS ]
+ Remove a trailing pathname component, shortening the path by one
+ directory level: this is the `head' of the pathname. This works
+ like `dirname'. If the h is followed immediately (with no spaces
+ or other separator) by any number of decimal digits, and the value
+ of the resulting number is non-zero, that number of leading
+ components is preserved instead of the final component being
+ removed. In an absolute path the leading `/' is the first
+ component, so, for example, if var=/my/path/to/something, then
+ ${var:h3} substitutes /my/path. Consecutive `/'s are treated the
+ same as a single `/'. In parameter substitution, digits may only
+ be used if the expression is in braces, so for example the short
+ form substitution $var:h2 is treated as ${var:h}2, not as
+ ${var:h2}. No restriction applies to the use of digits in history
+ substitution or globbing qualifiers. If more components are
+ requested than are present, the entire path is substituted (so
+ this does not trigger a `failed modifier' error in history
+ expansion).
+
+l
+ Convert the words to all lowercase.
+
+p
+ Print the new command but do not execute it. Only works with
+ history expansion.
+
+P
+ Turn a file name into an absolute path, like realpath(3). The
+ resulting path will be absolute, have neither `.' nor `..'
+ components, and refer to the same directory entry as the input
+ filename.
+
+ Unlike realpath(3), non-existent trailing components are permitted
+ and preserved.
+
+q
+ Quote the substituted words, escaping further substitutions. Works
+ with history expansion and parameter expansion, though for
+ parameters it is only useful if the resulting text is to be
+ re-evaluated such as by eval.
+
+Q
+ Remove one level of quotes from the substituted words.
+
+r
+ Remove a filename extension leaving the root name. Strings with no
+ filename extension are not altered. A filename extension is a `.'
+ followed by any number of characters (including zero) that are
+ neither `.' nor `/' and that continue to the end of the string.
+ For example, the extension of `foo.orig.c' is `.c', and
+ `dir.c/foo' has no extension.
+
+s/L/R[/]
+ Substitute R for L as described below. The substitution is done
+ only for the first string that matches L. For arrays and for
+ filename generation, this applies to each word of the expanded
+ text. See below for further notes on substitutions.
+
+ The forms `gs/L/R' and `s/L/R/:G' perform global substitution,
+ i.e. substitute every occurrence of R for L. Note that the g or
+ :G must appear in exactly the position shown.
+
+ See further notes on this form of substitution below.
+
+&
+ Repeat the previous s substitution. Like s, may be preceded
+ immediately by a g. In parameter expansion the & must appear
+ inside braces, and in filename generation it must be quoted with a
+ backslash.
+
+t [ DIGITS ]
+ Remove all leading pathname components, leaving the final
+ component (tail). This works like `basename'. Any trailing
+ slashes are first removed. Decimal digits are handled as
+ described above for (h), but in this case that number of trailing
+ components is preserved instead of the default 1; 0 is treated the
+ same as 1.
+
+u
+ Convert the words to all uppercase.
+
+x
+ Like q, but break into words at whitespace. Does not work with
+ parameter expansion.
+
+
+The s/L/R/ substitution works as follows. By default the left-hand
+side of substitutions are not patterns, but character strings. Any
+character can be used as the delimiter in place of `/'. A backslash
+quotes the delimiter character. The character `&', in the
+right-hand-side R, is replaced by the text from the left-hand-side L.
+The `&' can be quoted with a backslash. A null L uses the previous
+string either from the previous L or from the contextual scan string S
+from `!?S'. You can omit the rightmost delimiter if a newline
+immediately follows R; the rightmost `?' in a context scan can
+similarly be omitted. Note the same record of the last L and R is
+maintained across all forms of expansion.
+
+Note that if a `&' is used within glob qualifiers an extra backslash is
+needed as a & is a special character in this case.
+
+Also note that the order of expansions affects the interpretation of L
+and R. When used in a history expansion, which occurs before any other
+expansions, L and R are treated as literal strings (except as explained
+for HIST_SUBST_PATTERN below). When used in parameter expansion, the
+replacement of R into the parameter's value is done first, and then any
+additional process, parameter, command, arithmetic, or brace references
+are applied, which may evaluate those substitutions and expansions more
+than once if L appears more than once in the starting value. When used
+in a glob qualifier, any substitutions or expansions are performed once
+at the time the qualifier is parsed, even before the `:s' expression
+itself is divided into L and R sides.
+
+If the option HIST_SUBST_PATTERN is set, L is treated as a pattern of
+the usual form described in *Note Filename Generation::. This can be
+used in all the places where modifiers are available; note, however,
+that in globbing qualifiers parameter substitution has already taken
+place, so parameters in the replacement string should be quoted to
+ensure they are replaced at the correct time. Note also that
+complicated patterns used in globbing qualifiers may need the extended
+glob qualifier notation (#q:s/.../.../) in order for the shell to
+recognize the expression as a glob qualifier. Further, note that bad
+patterns in the substitution are not subject to the NO_BAD_PATTERN
+option so will cause an error.
+
+When HIST_SUBST_PATTERN is set, L may start with a # to indicate that
+the pattern must match at the start of the string to be substituted,
+and a % may appear at the start or after an # to indicate that the
+pattern must match at the end of the string to be substituted. The %
+or # may be quoted with two backslashes.
+
+For example, the following piece of filename generation code with the
+EXTENDED_GLOB option:
+
+
+ print -r -- *.c(#q:s/#%(#b)s(*).c/'S${match[1]}.C'/)
+
+takes the expansion of *.c and applies the glob qualifiers in the
+(#q...) expression, which consists of a substitution modifier anchored
+to the start and end of each word (#%). This turns on backreferences
+((#b)), so that the parenthesised subexpression is available in the
+replacement string as ${match[1]}. The replacement string is quoted so
+that the parameter is not substituted before the start of filename
+generation.
+
+The following f, F, w and W modifiers work only with parameter
+expansion and filename generation. They are listed here to provide a
+single point of reference for all modifiers.
+
+
+f
+ Repeats the immediately (without a colon) following modifier until
+ the resulting word doesn't change any more.
+
+F:EXPR:
+ Like f, but repeats only N times if the expression EXPR evaluates
+ to N. Any character can be used instead of the `:'; if `(', `[',
+ or `{' is used as the opening delimiter, the closing delimiter
+ should be ')', `]', or `}', respectively.
+
+w
+ Makes the immediately following modifier work on each word in the
+ string.
+
+W:SEP:
+ Like w but words are considered to be the parts of the string that
+ are separated by SEP. Any character can be used instead of the
+ `:'; opening parentheses are handled specially, see above.
+
+
+
+File: zsh.info, Node: Process Substitution, Next: Parameter Expansion, Prev: History Expansion, Up: Expansion
+
+14.2 Process Substitution
+=========================
+
+Each part of a command argument that takes the form `<(LIST)',
+`>(LIST)' or `=(LIST)' is subject to process substitution. The
+expression may be preceded or followed by other strings except that, to
+prevent clashes with commonly occurring strings and patterns, the last
+form must occur at the start of a command argument, and the forms are
+only expanded when first parsing command or assignment arguments.
+Process substitutions may be used following redirection operators; in
+this case, the substitution must appear with no trailing string.
+
+Note that `<<(LIST)' is not a special syntax; it is equivalent to `<
+<(LIST)', redirecting standard input from the result of process
+substitution. Hence all the following documentation applies. The
+second form (with the space) is recommended for clarity.
+
+In the case of the < or > forms, the shell runs the commands in LIST as
+a subprocess of the job executing the shell command line. If the
+system supports the /dev/fd mechanism, the command argument is the name
+of the device file corresponding to a file descriptor; otherwise, if
+the system supports named pipes (FIFOs), the command argument will be a
+named pipe. If the form with > is selected then writing on this
+special file will provide input for LIST. If < is used, then the file
+passed as an argument will be connected to the output of the LIST
+process. For example,
+
+
+ paste <(cut -f1 FILE1) <(cut -f3 FILE2) |
+ tee >(PROCESS1) >(PROCESS2) >/dev/null
+
+cuts fields 1 and 3 from the files FILE1 and FILE2 respectively, pastes
+the results together, and sends it to the processes PROCESS1 and
+PROCESS2.
+
+If =(...) is used instead of <(...), then the file passed as an
+argument will be the name of a temporary file containing the output of
+the LIST process. This may be used instead of the < form for a program
+that expects to lseek (see man page lseek(2)) on the input file.
+
+There is an optimisation for substitutions of the form =(<<<ARG), where
+ARG is a single-word argument to the here-string redirection <<<. This
+form produces a file name containing the value of ARG after any
+substitutions have been performed. This is handled entirely within the
+current shell. This is effectively the reverse of the special form
+$(<ARG) which treats ARG as a file name and replaces it with the file's
+contents.
+
+The = form is useful as both the /dev/fd and the named pipe
+implementation of <(...) have drawbacks. In the former case, some
+programmes may automatically close the file descriptor in question
+before examining the file on the command line, particularly if this is
+necessary for security reasons such as when the programme is running
+setuid. In the second case, if the programme does not actually open
+the file, the subshell attempting to read from or write to the pipe
+will (in a typical implementation, different operating systems may have
+different behaviour) block for ever and have to be killed explicitly.
+In both cases, the shell actually supplies the information using a
+pipe, so that programmes that expect to lseek (see man page lseek(2))
+on the file will not work.
+
+Also note that the previous example can be more compactly and
+efficiently written (provided the MULTIOS option is set) as:
+
+
+ paste <(cut -f1 FILE1) <(cut -f3 FILE2) > >(PROCESS1) > >(PROCESS2)
+
+The shell uses pipes instead of FIFOs to implement the latter two
+process substitutions in the above example.
+
+There is an additional problem with >(PROCESS); when this is attached
+to an external command, the parent shell does not wait for PROCESS to
+finish and hence an immediately following command cannot rely on the
+results being complete. The problem and solution are the same as
+described in the section _MULTIOS_ in *Note Redirection::. Hence in a
+simplified version of the example above:
+
+
+ paste <(cut -f1 FILE1) <(cut -f3 FILE2) > >(PROCESS)
+
+(note that no MULTIOS are involved), PROCESS will be run asynchronously
+as far as the parent shell is concerned. The workaround is:
+
+
+ { paste <(cut -f1 FILE1) <(cut -f3 FILE2) } > >(PROCESS)
+
+The extra processes here are spawned from the parent shell which will
+wait for their completion.
+
+Another problem arises any time a job with a substitution that requires
+a temporary file is disowned by the shell, including the case where
+`&!' or `&|' appears at the end of a command containing a substitution.
+In that case the temporary file will not be cleaned up as the shell no
+longer has any memory of the job. A workaround is to use a subshell,
+for example,
+
+
+ (mycmd =(myoutput)) &!
+
+as the forked subshell will wait for the command to finish then remove
+the temporary file.
+
+A general workaround to ensure a process substitution endures for an
+appropriate length of time is to pass it as a parameter to an anonymous
+shell function (a piece of shell code that is run immediately with
+function scope). For example, this code:
+
+
+ () {
+ print File $1:
+ cat $1
+ } =(print This be the verse)
+
+outputs something resembling the following
+
+
+ File /tmp/zsh6nU0kS:
+ This be the verse
+
+The temporary file created by the process substitution will be deleted
+when the function exits.
+
+
+
+
+File: zsh.info, Node: Parameter Expansion, Next: Command Substitution, Prev: Process Substitution, Up: Expansion
+
+14.3 Parameter Expansion
+========================
+
+The character `$' is used to introduce parameter expansions. See *Note
+Parameters:: for a description of parameters, including arrays,
+associative arrays, and subscript notation to access individual array
+elements.
+
+Note in particular the fact that words of unquoted parameters are not
+automatically split on whitespace unless the option SH_WORD_SPLIT is
+set; see references to this option below for more details. This is an
+important difference from other shells. However, as in other shells,
+null words are elided from unquoted parameters' expansions.
+
+With default options, after the assignments:
+
+
+ array=("first word" "" "third word")
+ scalar="only word"
+
+then $array substitutes two words, `first word' and `third word', and
+$scalar substitutes a single word `only word'. Note that second
+element of array was elided. Scalar parameters can be elided too if
+their value is null (empty). To avoid elision, use quoting as follows:
+"$scalar" for scalars and "${array[@]}" or "${(@)array}" for arrays.
+(The last two forms are equivalent.)
+
+Parameter expansions can involve _flags_, as in `${(@kv)aliases}', and
+other operators, such as `${PREFIX:-"/usr/local"}'. Parameter
+expansions can also be nested. These topics will be introduced below.
+The full rules are complicated and are noted at the end.
+
+In the expansions discussed below that require a pattern, the form of
+the pattern is the same as that used for filename generation; see *Note
+Filename Generation::. Note that these patterns, along with the
+replacement text of any substitutions, are themselves subject to
+parameter expansion, command substitution, and arithmetic expansion.
+In addition to the following operations, the colon modifiers described
+in *Note Modifiers:: in *Note History Expansion:: can be applied: for
+example, ${i:s/foo/bar/} performs string substitution on the expansion
+of parameter $i.
+
+In the following descriptions, `WORD' refers to a single word
+substituted on the command line, not necessarily a space delimited word.
+
+
+${NAME}
+ The value, if any, of the parameter NAME is substituted. The
+ braces are required if the expansion is to be followed by a
+ letter, digit, or underscore that is not to be interpreted as part
+ of NAME. In addition, more complicated forms of substitution
+ usually require the braces to be present; exceptions, which only
+ apply if the option KSH_ARRAYS is not set, are a single subscript
+ or any colon modifiers appearing after the name, or any of the
+ characters `^', `=', `~', `#' or `+' appearing before the name,
+ all of which work with or without braces.
+
+ If NAME is an array parameter, and the KSH_ARRAYS option is not
+ set, then the value of each element of NAME is substituted, one
+ element per word. Otherwise, the expansion results in one word
+ only; with KSH_ARRAYS, this is the first element of an array. No
+ field splitting is done on the result unless the SH_WORD_SPLIT
+ option is set. See also the flags = and s:STRING:.
+
+${+NAME}
+ If NAME is the name of a set parameter `1' is substituted,
+ otherwise `0' is substituted.
+
+${NAME-WORD}
+${NAME:-WORD}
+ If NAME is set, or in the second form is non-null, then substitute
+ its value; otherwise substitute WORD. In the second form NAME may
+ be omitted, in which case WORD is always substituted.
+
+${NAME+WORD}
+${NAME:+WORD}
+ If NAME is set, or in the second form is non-null, then substitute
+ WORD; otherwise substitute nothing.
+
+${NAME=WORD}
+${NAME:=WORD}
+${NAME::=WORD}
+ In the first form, if NAME is unset then set it to WORD; in the
+ second form, if NAME is unset or null then set it to WORD; and in
+ the third form, unconditionally set NAME to WORD. In all forms,
+ the value of the parameter is then substituted.
+
+${NAME?WORD}
+${NAME:?WORD}
+ In the first form, if NAME is set, or in the second form if NAME
+ is both set and non-null, then substitute its value; otherwise,
+ print WORD and exit from the shell. Interactive shells instead
+ return to the prompt. If WORD is omitted, then a standard message
+ is printed.
+
+
+In any of the above expressions that test a variable and substitute an
+alternate WORD, note that you can use standard shell quoting in the
+WORD value to selectively override the splitting done by the
+SH_WORD_SPLIT option and the = flag, but not splitting by the s:STRING:
+flag.
+
+In the following expressions, when NAME is an array and the
+substitution is not quoted, or if the `(@)' flag or the NAME[@] syntax
+is used, matching and replacement is performed on each array element
+separately.
+
+
+${NAME#PATTERN}
+${NAME##PATTERN}
+ If the PATTERN matches the beginning of the value of NAME, then
+ substitute the value of NAME with the matched portion deleted;
+ otherwise, just substitute the value of NAME. In the first form,
+ the smallest matching pattern is preferred; in the second form,
+ the largest matching pattern is preferred.
+
+${NAME%PATTERN}
+${NAME%%PATTERN}
+ If the PATTERN matches the end of the value of NAME, then
+ substitute the value of NAME with the matched portion deleted;
+ otherwise, just substitute the value of NAME. In the first form,
+ the smallest matching pattern is preferred; in the second form,
+ the largest matching pattern is preferred.
+
+${NAME:#PATTERN}
+ If the PATTERN matches the value of NAME, then substitute the
+ empty string; otherwise, just substitute the value of NAME. If
+ NAME is an array the matching array elements are removed (use the
+ `(M)' flag to remove the non-matched elements).
+
+${NAME:|ARRAYNAME}
+ If ARRAYNAME is the name (N.B., not contents) of an array
+ variable, then any elements contained in ARRAYNAME are removed
+ from the substitution of NAME. If the substitution is scalar,
+ either because NAME is a scalar variable or the expression is
+ quoted, the elements of ARRAYNAME are instead tested against the
+ entire expression.
+
+${NAME:*ARRAYNAME}
+ Similar to the preceding substitution, but in the opposite sense,
+ so that entries present in both the original substitution and as
+ elements of ARRAYNAME are retained and others removed.
+
+${NAME:^ARRAYNAME}
+${NAME:^^ARRAYNAME}
+ Zips two arrays, such that the output array is twice as long as the
+ shortest (longest for `:^^') of name and arrayname, with the
+ elements alternatingly being picked from them. For `:^', if one of
+ the input arrays is longer, the output will stop when the end of
+ the shorter array is reached. Thus,
+
+
+ a=(1 2 3 4); b=(a b); print ${a:^b}
+
+ will output `1 a 2 b'. For `:^^', then the input is repeated
+ until all of the longer array has been used up and the above will
+ output `1 a 2 b 3 a 4 b'.
+
+ Either or both inputs may be a scalar, they will be treated as an
+ array of length 1 with the scalar as the only element. If either
+ array is empty, the other array is output with no extra elements
+ inserted.
+
+ Currently the following code will output `a b' and `1' as two
+ separate elements, which can be unexpected. The second print
+ provides a workaround which should continue to work if this is
+ changed.
+
+
+ a=(a b); b=(1 2); print -l "${a:^b}"; print -l "${${a:^b}}"
+
+${NAME:OFFSET}
+${NAME:OFFSET:LENGTH}
+ This syntax gives effects similar to parameter subscripting in the
+ form $NAME[START,END], but is compatible with other shells; note
+ that both OFFSET and LENGTH are interpreted differently from the
+ components of a subscript.
+
+ If OFFSET is non-negative, then if the variable NAME is a scalar
+ substitute the contents starting OFFSET characters from the first
+ character of the string, and if NAME is an array substitute
+ elements starting OFFSET elements from the first element. If
+ LENGTH is given, substitute that many characters or elements,
+ otherwise the entire rest of the scalar or array.
+
+ A positive OFFSET is always treated as the offset of a character or
+ element in NAME from the first character or element of the array
+ (this is different from native zsh subscript notation). Hence 0
+ refers to the first character or element regardless of the setting
+ of the option KSH_ARRAYS.
+
+ A negative offset counts backwards from the end of the scalar or
+ array, so that -1 corresponds to the last character or element,
+ and so on.
+
+ When positive, LENGTH counts from the OFFSET position toward the
+ end of the scalar or array. When negative, LENGTH counts back
+ from the end. If this results in a position smaller than OFFSET,
+ a diagnostic is printed and nothing is substituted.
+
+ The option MULTIBYTE is obeyed, i.e. the offset and length count
+ multibyte characters where appropriate.
+
+ OFFSET and LENGTH undergo the same set of shell substitutions as
+ for scalar assignment; in addition, they are then subject to
+ arithmetic evaluation. Hence, for example
+
+
+ print ${foo:3}
+ print ${foo: 1 + 2}
+ print ${foo:$(( 1 + 2))}
+ print ${foo:$(echo 1 + 2)}
+
+ all have the same effect, extracting the string starting at the
+ fourth character of $foo if the substitution would otherwise
+ return a scalar, or the array starting at the fourth element if
+ $foo would return an array. Note that with the option KSH_ARRAYS
+ $foo always returns a scalar (regardless of the use of the offset
+ syntax) and a form such as ${foo[*]:3} is required to extract
+ elements of an array named foo.
+
+ If OFFSET is negative, the - may not appear immediately after the
+ : as this indicates the ${NAME:-WORD} form of substitution.
+ Instead, a space may be inserted before the -. Furthermore,
+ neither OFFSET nor LENGTH may begin with an alphabetic character
+ or & as these are used to indicate history-style modifiers. To
+ substitute a value from a variable, the recommended approach is to
+ precede it with a $ as this signifies the intention (parameter
+ substitution can easily be rendered unreadable); however, as
+ arithmetic substitution is performed, the expression ${var: offs}
+ does work, retrieving the offset from $offs.
+
+ For further compatibility with other shells there is a special case
+ for array offset 0. This usually accesses the first element of
+ the array. However, if the substitution refers to the positional
+ parameter array, e.g. $@ or $*, then offset 0 instead refers to
+ $0, offset 1 refers to $1, and so on. In other words, the
+ positional parameter array is effectively extended by prepending
+ $0. Hence ${*:0:1} substitutes $0 and ${*:1:1} substitutes $1.
+
+${NAME/PATTERN/REPL}
+${NAME//PATTERN/REPL}
+${NAME:/PATTERN/REPL}
+ Replace the longest possible match of PATTERN in the expansion of
+ parameter NAME by string REPL. The first form replaces just the
+ first occurrence, the second form all occurrences, and the third
+ form replaces only if PATTERN matches the entire string. Both
+ PATTERN and REPL are subject to double-quoted substitution, so
+ that expressions like ${name/$opat/$npat} will work, but obey the
+ usual rule that pattern characters in $opat are not treated
+ specially unless either the option GLOB_SUBST is set, or $opat is
+ instead substituted as ${~opat}.
+
+ The PATTERN may begin with a `#', in which case the PATTERN must
+ match at the start of the string, or `%', in which case it must
+ match at the end of the string, or `#%' in which case the PATTERN
+ must match the entire string. The REPL may be an empty string, in
+ which case the final `/' may also be omitted. To quote the final
+ `/' in other cases it should be preceded by a single backslash;
+ this is not necessary if the `/' occurs inside a substituted
+ parameter. Note also that the `#', `%' and `#% are not active if
+ they occur inside a substituted parameter, even at the start.
+
+ If, after quoting rules apply, ${NAME} expands to an array, the
+ replacements act on each element individually. Note also the
+ effect of the I and S parameter expansion flags below; however,
+ the flags M, R, B, E and N are not useful.
+
+ For example,
+
+
+ foo="twinkle twinkle little star" sub="t*e" rep="spy"
+ print ${foo//${~sub}/$rep}
+ print ${(S)foo//${~sub}/$rep}
+
+ Here, the `~' ensures that the text of $sub is treated as a
+ pattern rather than a plain string. In the first case, the longest
+ match for t*e is substituted and the result is `spy star', while
+ in the second case, the shortest matches are taken and the result
+ is `spy spy lispy star'.
+
+${#SPEC}
+ If SPEC is one of the above substitutions, substitute the length
+ in characters of the result instead of the result itself. If SPEC
+ is an array expression, substitute the number of elements of the
+ result. This has the side-effect that joining is skipped even in
+ quoted forms, which may affect other sub-expressions in SPEC.
+ Note that `^', `=', and `~', below, must appear to the left of `#'
+ when these forms are combined.
+
+ If the option POSIX_IDENTIFIERS is not set, and SPEC is a simple
+ name, then the braces are optional; this is true even for special
+ parameters so e.g. $#- and $#* take the length of the string $-
+ and the array $* respectively. If POSIX_IDENTIFIERS is set, then
+ braces are required for the # to be treated in this fashion.
+
+${^SPEC}
+ Turn on the RC_EXPAND_PARAM option for the evaluation of SPEC; if
+ the `^' is doubled, turn it off. When this option is set, array
+ expansions of the form FOO${XX}BAR, where the parameter XX is set
+ to (A B C), are substituted with `FOOABAR FOOBBAR FOOCBAR' instead
+ of the default `FOOA B CBAR'. Note that an empty array will
+ therefore cause all arguments to be removed.
+
+ Internally, each such expansion is converted into the equivalent
+ list for brace expansion. E.g., ${^var} becomes
+ {$var[1],$var[2],...}, and is processed as described in *Note
+ Brace Expansion:: below: note, however, the expansion happens
+ immediately, with any explicit brace expansion happening later.
+ If word splitting is also in effect the $var[N] may themselves be
+ split into different list elements.
+
+${=SPEC}
+ Perform word splitting using the rules for SH_WORD_SPLIT during the
+ evaluation of SPEC, but regardless of whether the parameter
+ appears in double quotes; if the `=' is doubled, turn it off. This
+ forces parameter expansions to be split into separate words before
+ substitution, using IFS as a delimiter. This is done by default
+ in most other shells.
+
+ Note that splitting is applied to WORD in the assignment forms of
+ SPEC _before_ the assignment to NAME is performed. This affects
+ the result of array assignments with the A flag.
+
+${~SPEC}
+ Turn on the GLOB_SUBST option for the evaluation of SPEC; if the
+ `~' is doubled, turn it off. When this option is set, the string
+ resulting from the expansion will be interpreted as a pattern
+ anywhere that is possible, such as in filename expansion and
+ filename generation and pattern-matching contexts like the right
+ hand side of the `=' and `!=' operators in conditions.
+
+ In nested substitutions, note that the effect of the ~ applies to
+ the result of the current level of substitution. A surrounding
+ pattern operation on the result may cancel it. Hence, for
+ example, if the parameter foo is set to *, ${~foo//\*/*.c} is
+ substituted by the pattern *.c, which may be expanded by filename
+ generation, but ${${~foo}//\*/*.c} substitutes to the string *.c,
+ which will not be further expanded.
+
+
+If a ${...} type parameter expression or a $(...) type command
+substitution is used in place of NAME above, it is expanded first and
+the result is used as if it were the value of NAME. Thus it is
+possible to perform nested operations: ${${foo#head}%tail} substitutes
+the value of $foo with both `head' and `tail' deleted. The form with
+$(...) is often useful in combination with the flags described next;
+see the examples below. Each NAME or nested ${...} in a parameter
+expansion may also be followed by a subscript expression as described in
+*Note Array Parameters::.
+
+Note that double quotes may appear around nested expressions, in which
+case only the part inside is treated as quoted; for example,
+${(f)"$(foo)"} quotes the result of $(foo), but the flag `(f)' (see
+below) is applied using the rules for unquoted expansions. Note
+further that quotes are themselves nested in this context; for example,
+in "${(@f)"$(foo)"}", there are two sets of quotes, one surrounding the
+whole expression, the other (redundant) surrounding the $(foo) as
+before.
+
+
+
+14.3.1 Parameter Expansion Flags
+--------------------------------
+
+If the opening brace is directly followed by an opening parenthesis,
+the string up to the matching closing parenthesis will be taken as a
+list of flags. In cases where repeating a flag is meaningful, the
+repetitions need not be consecutive; for example, `(q%q%q)' means the
+same thing as the more readable `(%%qqq)'. The following flags are
+supported:
+
+
+#
+ Evaluate the resulting words as numeric expressions and output the
+ characters corresponding to the resulting integer. Note that this
+ form is entirely distinct from use of the # without parentheses.
+
+ If the MULTIBYTE option is set and the number is greater than 127
+ (i.e. not an ASCII character) it is treated as a Unicode character.
+
+%
+ Expand all % escapes in the resulting words in the same way as in
+ prompts (see *Note Prompt Expansion::). If this flag is given
+ twice, full prompt expansion is done on the resulting words,
+ depending on the setting of the PROMPT_PERCENT, PROMPT_SUBST and
+ PROMPT_BANG options.
+
+@
+ In double quotes, array elements are put into separate words.
+ E.g., `"${(@)foo}"' is equivalent to `"${foo[@]}"' and
+ `"${(@)foo[1,2]}"' is the same as `"$foo[1]" "$foo[2]"'. This is
+ distinct from _field splitting_ by the f, s or z flags, which
+ still applies within each array element.
+
+A
+ Convert the substitution into an array expression, even if it
+ otherwise would be scalar. This has lower precedence than
+ subscripting, so one level of nested expansion is required in
+ order that subscripts apply to array elements. Thus
+ ${${(A)NAME}[1]} yields the full value of NAME when NAME is scalar.
+
+ This assigns an array parameter with `${...=...}', `${...:=...}'
+ or `${...::=...}'. If this flag is repeated (as in `AA'), assigns
+ an associative array parameter. Assignment is made before sorting
+ or padding; if field splitting is active, the WORD part is split
+ before assignment. The NAME part may be a subscripted range for
+ ordinary arrays; when assigning an associative array, the WORD
+ part _must_ be converted to an array, for example by using
+ `${(AA)=NAME=...}' to activate field splitting.
+
+ Surrounding context such as additional nesting or use of the value
+ in a scalar assignment may cause the array to be joined back into
+ a single string again.
+
+a
+ Sort in array index order; when combined with `O' sort in reverse
+ array index order. Note that `a' is therefore equivalent to the
+ default but `Oa' is useful for obtaining an array's elements in
+ reverse order.
+
+b
+ Quote with backslashes only characters that are special to pattern
+ matching. This is useful when the contents of the variable are to
+ be tested using GLOB_SUBST, including the ${~...} switch.
+
+ Quoting using one of the q family of flags does not work for this
+ purpose since quotes are not stripped from non-pattern characters
+ by GLOB_SUBST. In other words,
+
+
+ pattern=${(q)str}
+ [[ $str = ${~pattern} ]]
+
+ works if $str is `a*b' but not if it is `a b', whereas
+
+
+ pattern=${(b)str}
+ [[ $str = ${~pattern} ]]
+
+ is always true for any possible value of $str.
+
+c
+ With ${#NAME}, count the total number of characters in an array,
+ as if the elements were concatenated with spaces between them.
+ This is not a true join of the array, so other expressions used
+ with this flag may have an effect on the elements of the array
+ before it is counted.
+
+C
+ Capitalize the resulting words. `Words' in this case refers to
+ sequences of alphanumeric characters separated by
+ non-alphanumerics, _not_ to words that result from field splitting.
+
+D
+ Assume the string or array elements contain directories and attempt
+ to substitute the leading part of these by names. The remainder of
+ the path (the whole of it if the leading part was not substituted)
+ is then quoted so that the whole string can be used as a shell
+ argument. This is the reverse of `~' substitution: see *Note
+ Filename Expansion::.
+
+e
+ Perform single word shell expansions, namely _parameter expansion_,
+ _command substitution_ and _arithmetic expansion_, on the result.
+ Such expansions can be nested but too deep recursion may have
+ unpredictable effects.
+
+f
+ Split the result of the expansion at newlines. This is a shorthand
+ for `ps:\n:'.
+
+F
+ Join the words of arrays together using newline as a separator.
+ This is a shorthand for `pj:\n:'.
+
+g:OPTS:
+ Process escape sequences like the echo builtin when no options are
+ given (g::). With the o option, octal escapes don't take a leading
+ zero. With the c option, sequences like `^X' are also processed.
+ With the e option, processes `\M-t' and similar sequences like the
+ print builtin. With both of the o and e options, behaves like the
+ print builtin except that in none of these modes is `\c'
+ interpreted.
+
+i
+ Sort case-insensitively. May be combined with `n' or `O'.
+
+k
+ If NAME refers to an associative array, substitute the _keys_
+ (element names) rather than the values of the elements. Used with
+ subscripts (including ordinary arrays), force indices or keys to be
+ substituted even if the subscript form refers to values. However,
+ this flag may not be combined with subscript ranges. With the
+ KSH_ARRAYS option a subscript `[*]' or `[@]' is needed to operate
+ on the whole array, as usual.
+
+L
+ Convert all letters in the result to lower case.
+
+n
+ Sort decimal integers numerically; if the first differing
+ characters of two test strings are not digits, sorting is lexical.
+ Integers with more initial zeroes are sorted before those with
+ fewer or none. Hence the array `foo1 foo02 foo2 foo3 foo20 foo23'
+ is sorted into the order shown. May be combined with `i' or `O'.
+
+o
+ Sort the resulting words in ascending order; if this appears on its
+ own the sorting is lexical and case-sensitive (unless the locale
+ renders it case-insensitive). Sorting in ascending order is the
+ default for other forms of sorting, so this is ignored if combined
+ with `a', `i' or `n'.
+
+O
+ Sort the resulting words in descending order; `O' without `a', `i'
+ or `n' sorts in reverse lexical order. May be combined with `a',
+ `i' or `n' to reverse the order of sorting.
+
+P
+ This forces the value of the parameter NAME to be interpreted as a
+ further parameter name, whose value will be used where appropriate.
+ Note that flags set with one of the typeset family of commands (in
+ particular case transformations) are not applied to the value of
+ NAME used in this fashion.
+
+ If used with a nested parameter or command substitution, the
+ result of that will be taken as a parameter name in the same way.
+ For example, if you have `foo=bar' and `bar=baz', the strings
+ ${(P)foo}, ${(P)${foo}}, and ${(P)$(echo bar)} will be expanded to
+ `baz'.
+
+ Likewise, if the reference is itself nested, the expression with
+ the flag is treated as if it were directly replaced by the
+ parameter name. It is an error if this nested substitution
+ produces an array with more than one word. For example, if
+ `name=assoc' where the parameter assoc is an associative array,
+ then `${${(P)name}[elt]}' refers to the element of the associative
+ subscripted `elt'.
+
+q
+ Quote characters that are special to the shell in the resulting
+ words with backslashes; unprintable or invalid characters are
+ quoted using the $'\NNN' form, with separate quotes for each octet.
+
+ If this flag is given twice, the resulting words are quoted in
+ single quotes and if it is given three times, the words are quoted
+ in double quotes; in these forms no special handling of
+ unprintable or invalid characters is attempted. If the flag is
+ given four times, the words are quoted in single quotes preceded
+ by a $. Note that in all three of these forms quoting is done
+ unconditionally, even if this does not change the way the
+ resulting string would be interpreted by the shell.
+
+ If a q- is given (only a single q may appear), a minimal form of
+ single quoting is used that only quotes the string if needed to
+ protect special characters. Typically this form gives the most
+ readable output.
+
+ If a q+ is given, an extended form of minimal quoting is used that
+ causes unprintable characters to be rendered using $'...'. This
+ quoting is similar to that used by the output of values by the
+ typeset family of commands.
+
+Q
+ Remove one level of quotes from the resulting words.
+
+t
+ Use a string describing the type of the parameter where the value
+ of the parameter would usually appear. This string consists of
+ keywords separated by hyphens (`-'). The first keyword in the
+ string describes the main type, it can be one of `scalar',
+ `array', `integer', `float' or `association'. The other keywords
+ describe the type in more detail:
+
+
+ local
+ for local parameters
+
+ left
+ for left justified parameters
+
+ right_blanks
+ for right justified parameters with leading blanks
+
+ right_zeros
+ for right justified parameters with leading zeros
+
+ lower
+ for parameters whose value is converted to all lower case
+ when it is expanded
+
+ upper
+ for parameters whose value is converted to all upper case
+ when it is expanded
+
+ readonly
+ for readonly parameters
+
+ tag
+ for tagged parameters
+
+ export
+ for exported parameters
+
+ unique
+ for arrays which keep only the first occurrence of duplicated
+ values
+
+ hide
+ for parameters with the `hide' flag
+
+ hideval
+ for parameters with the `hideval' flag
+
+ special
+ for special parameters defined by the shell
+
+
+u
+ Expand only the first occurrence of each unique word.
+
+U
+ Convert all letters in the result to upper case.
+
+v
+ Used with k, substitute (as two consecutive words) both the key
+ and the value of each associative array element. Used with
+ subscripts, force values to be substituted even if the subscript
+ form refers to indices or keys.
+
+V
+ Make any special characters in the resulting words visible.
+
+w
+ With ${#NAME}, count words in arrays or strings; the s flag may be
+ used to set a word delimiter.
+
+W
+ Similar to w with the difference that empty words between repeated
+ delimiters are also counted.
+
+X
+ With this flag, parsing errors occurring with the Q, e and # flags
+ or the pattern matching forms such as `${NAME#PATTERN}' are
+ reported. Without the flag, errors are silently ignored.
+
+z
+ Split the result of the expansion into words using shell parsing to
+ find the words, i.e. taking into account any quoting in the value.
+ Comments are not treated specially but as ordinary strings, similar
+ to interactive shells with the INTERACTIVE_COMMENTS option unset
+ (however, see the Z flag below for related options)
+
+ Note that this is done very late, even later than the `(s)' flag.
+ So to access single words in the result use nested expansions as
+ in `${${(z)foo}[2]}'. Likewise, to remove the quotes in the
+ resulting words use `${(Q)${(z)foo}}'.
+
+0
+ Split the result of the expansion on null bytes. This is a
+ shorthand for `ps:\0:'.
+
+
+The following flags (except p) are followed by one or more arguments as
+shown. Any character, or the matching pairs `(...)', `{...}', `[...]',
+or `<...>', may be used in place of a colon as delimiters, but note
+that when a flag takes more than one argument, a matched pair of
+delimiters must surround each argument.
+
+
+p
+ Recognize the same escape sequences as the print builtin in string
+ arguments to any of the flags described below that follow this
+ argument.
+
+ Alternatively, with this option string arguments may be in the form
+ $VAR in which case the value of the variable is substituted. Note
+ this form is strict; the string argument does not undergo general
+ parameter expansion.
+
+ For example,
+
+
+ sep=:
+ val=a:b:c
+ print ${(ps.$sep.)val}
+
+ splits the variable on a :.
+
+~
+ Strings inserted into the expansion by any of the flags below are
+ to be treated as patterns. This applies to the string arguments
+ of flags that follow ~ within the same set of parentheses.
+ Compare with ~ outside parentheses, which forces the entire
+ substituted string to be treated as a pattern. Hence, for example,
+
+
+ [[ "?" = ${(~j.|.)array} ]]
+
+ treats `|' as a pattern and succeeds if and only if $array
+ contains the string `?' as an element. The ~ may be repeated to
+ toggle the behaviour; its effect only lasts to the end of the
+ parenthesised group.
+
+j:STRING:
+ Join the words of arrays together using STRING as a separator. Note
+ that this occurs before field splitting by the s:STRING: flag or
+ the SH_WORD_SPLIT option.
+
+l:EXPR::STRING1::STRING2:
+ Pad the resulting words on the left. Each word will be truncated
+ if required and placed in a field EXPR characters wide.
+
+ The arguments :STRING1: and :STRING2: are optional; neither, the
+ first, or both may be given. Note that the same pairs of
+ delimiters must be used for each of the three arguments. The
+ space to the left will be filled with STRING1 (concatenated as
+ often as needed) or spaces if STRING1 is not given. If both
+ STRING1 and STRING2 are given, STRING2 is inserted once directly
+ to the left of each word, truncated if necessary, before STRING1
+ is used to produce any remaining padding.
+
+ If either of STRING1 or STRING2 is present but empty, i.e. there
+ are two delimiters together at that point, the first character of
+ $IFS is used instead.
+
+ If the MULTIBYTE option is in effect, the flag m may also be
+ given, in which case widths will be used for the calculation of
+ padding; otherwise individual multibyte characters are treated as
+ occupying one unit of width.
+
+ If the MULTIBYTE option is not in effect, each byte in the string
+ is treated as occupying one unit of width.
+
+ Control characters are always assumed to be one unit wide; this
+ allows the mechanism to be used for generating repetitions of
+ control characters.
+
+m
+ Only useful together with one of the flags l or r or with the #
+ length operator when the MULTIBYTE option is in effect. Use the
+ character width reported by the system in calculating how much of
+ the string it occupies or the overall length of the string. Most
+ printable characters have a width of one unit, however certain
+ Asian character sets and certain special effects use wider
+ characters; combining characters have zero width. Non-printable
+ characters are arbitrarily counted as zero width; how they would
+ actually be displayed will vary.
+
+ If the m is repeated, the character either counts zero (if it has
+ zero width), else one. For printable character strings this has
+ the effect of counting the number of glyphs (visibly separate
+ characters), except for the case where combining characters
+ themselves have non-zero width (true in certain alphabets).
+
+r:EXPR::STRING1::STRING2:
+ As l, but pad the words on the right and insert STRING2
+ immediately to the right of the string to be padded.
+
+ Left and right padding may be used together. In this case the
+ strategy is to apply left padding to the first half width of each
+ of the resulting words, and right padding to the second half. If
+ the string to be padded has odd width the extra padding is applied
+ on the left.
+
+s:STRING:
+ Force field splitting at the separator STRING. Note that a STRING
+ of two or more characters means that all of them must match in
+ sequence; this differs from the treatment of two or more
+ characters in the IFS parameter. See also the = flag and the
+ SH_WORD_SPLIT option. An empty string may also be given in which
+ case every character will be a separate element.
+
+ For historical reasons, the usual behaviour that empty array
+ elements are retained inside double quotes is disabled for arrays
+ generated by splitting; hence the following:
+
+
+ line="one::three"
+ print -l "${(s.:.)line}"
+
+ produces two lines of output for one and three and elides the
+ empty field. To override this behaviour, supply the `(@)' flag as
+ well, i.e. "${(@s.:.)line}".
+
+Z:OPTS:
+ As z but takes a combination of option letters between a following
+ pair of delimiter characters. With no options the effect is
+ identical to z. (Z+c+) causes comments to be parsed as a string
+ and retained; any field in the resulting array beginning with an
+ unquoted comment character is a comment. (Z+C+) causes comments
+ to be parsed and removed. The rule for comments is standard:
+ anything between a word starting with the third character of
+ $HISTCHARS, default #, up to the next newline is a comment.
+ (Z+n+) causes unquoted newlines to be treated as ordinary
+ whitespace, else they are treated as if they are shell code
+ delimiters and converted to semicolons. Options are combined
+ within the same set of delimiters, e.g. (Z+Cn+).
+
+_:FLAGS:
+ The underscore (_) flag is reserved for future use. As of this
+ revision of zsh, there are no valid FLAGS; anything following an
+ underscore, other than an empty pair of delimiters, is treated as
+ an error, and the flag itself has no effect.
+
+
+The following flags are meaningful with the ${...#...} or ${...%...}
+forms. The S and I flags may also be used with the ${.../...} forms.
+
+
+S
+ With # or ##, search for the match that starts closest to the
+ start of the string (a `substring match'). Of all matches at a
+ particular position, # selects the shortest and ## the longest:
+
+
+ % str="aXbXc"
+ % echo ${(S)str#X*}
+ abXc
+ % echo ${(S)str##X*}
+ a
+ %
+
+ With % or %%, search for the match that starts closest to the end
+ of the string:
+
+
+ % str="aXbXc"
+ % echo ${(S)str%X*}
+ aXbc
+ % echo ${(S)str%%X*}
+ aXb
+ %
+
+ (Note that % and %% don't search for the match that ends closest
+ to the end of the string, as one might expect.)
+
+ With substitution via ${.../...} or ${...//...}, specifies
+ non-greedy matching, i.e. that the shortest instead of the longest
+ match should be replaced:
+
+
+ % str="abab"
+ % echo ${str/*b/_}
+ _
+ % echo ${(S)str/*b/_}
+ _ab
+ %
+
+I:EXPR:
+ Search the EXPRth match (where EXPR evaluates to a number). This
+ only applies when searching for substrings, either with the S
+ flag, or with ${.../...} (only the EXPRth match is substituted) or
+ ${...//...} (all matches from the EXPRth on are substituted). The
+ default is to take the first match.
+
+ The EXPRth match is counted such that there is either one or zero
+ matches from each starting position in the string, although for
+ global substitution matches overlapping previous replacements are
+ ignored. With the ${...%...} and ${...%%...} forms, the starting
+ position for the match moves backwards from the end as the index
+ increases, while with the other forms it moves forward from the
+ start.
+
+ Hence with the string
+ which switch is the right switch for Ipswich?
+ substitutions of the form ${(SI:N:)string#w*ch} as N increases
+ from 1 will match and remove `which', `witch', `witch' and `wich';
+ the form using `##' will match and remove `which switch is the
+ right switch for Ipswich', `witch is the right switch for
+ Ipswich', `witch for Ipswich' and `wich'. The form using `%' will
+ remove the same matches as for `#', but in reverse order, and the
+ form using `%%' will remove the same matches as for `##' in reverse
+ order.
+
+B
+ Include the index of the beginning of the match in the result.
+
+E
+ Include the index one character past the end of the match in the
+ result (note this is inconsistent with other uses of parameter
+ index).
+
+M
+ Include the matched portion in the result.
+
+N
+ Include the length of the match in the result.
+
+R
+ Include the unmatched portion in the result (the _R_est).
+
+
+
+14.3.2 Rules
+------------
+
+Here is a summary of the rules for substitution; this assumes that
+braces are present around the substitution, i.e. ${...}. Some
+particular examples are given below. Note that the Zsh Development
+Group accepts _no responsibility_ for any brain damage which may occur
+during the reading of the following rules.
+
+
+1. _Nested substitution_
+ If multiple nested ${...} forms are present, substitution is
+ performed from the inside outwards. At each level, the
+ substitution takes account of whether the current value is a
+ scalar or an array, whether the whole substitution is in double
+ quotes, and what flags are supplied to the current level of
+ substitution, just as if the nested substitution were the
+ outermost. The flags are not propagated up to enclosing
+ substitutions; the nested substitution will return either a scalar
+ or an array as determined by the flags, possibly adjusted for
+ quoting. All the following steps take place where applicable at
+ all levels of substitution.
+
+ Note that, unless the `(P)' flag is present, the flags and any
+ subscripts apply directly to the value of the nested substitution;
+ for example, the expansion ${${foo}} behaves exactly the same as
+ ${foo}. When the `(P)' flag is present in a nested substitution,
+ the other substitution rules are applied to the value _before_ it
+ is interpreted as a name, so ${${(P)foo}} may differ from
+ ${(P)foo}.
+
+ At each nested level of substitution, the substituted words
+ undergo all forms of single-word substitution (i.e. not filename
+ generation), including command substitution, arithmetic expansion
+ and filename expansion (i.e. leading ~ and =). Thus, for example,
+ ${${:-=cat}:h} expands to the directory where the cat program
+ resides. (Explanation: the internal substitution has no parameter
+ but a default value =cat, which is expanded by filename expansion
+ to a full path; the outer substitution then applies the modifier
+ :h and takes the directory part of the path.)
+
+2. _Internal parameter flags_
+ Any parameter flags set by one of the typeset family of commands,
+ in particular the -L, -R, -Z, -u and -l options for padding and
+ capitalization, are applied directly to the parameter value. Note
+ these flags are options to the command, e.g. `typeset -Z'; they
+ are not the same as the flags used within parameter substitutions.
+
+ At the outermost level of substitution, the `(P)' flag (rule 4.)
+ ignores these transformations and uses the unmodified value of the
+ parameter as the name to be replaced. This is usually the desired
+ behavior because padding may make the value syntactically illegal
+ as a parameter name, but if capitalization changes are desired,
+ use the ${${(P)foo}} form (rule 25.).
+
+3. _Parameter subscripting_
+ If the value is a raw parameter reference with a subscript, such as
+ ${VAR[3]}, the effect of subscripting is applied directly to the
+ parameter. Subscripts are evaluated left to right; subsequent
+ subscripts apply to the scalar or array value yielded by the
+ previous subscript. Thus if var is an array, ${var[1][2]} is the
+ second character of the first word, but ${var[2,4][2]} is the
+ entire third word (the second word of the range of words two
+ through four of the original array). Any number of subscripts may
+ appear. Flags such as `(k)' and `(v)' which alter the result of
+ subscripting are applied.
+
+4. _Parameter name replacement_
+ At the outermost level of nesting only, the `(P)' flag is applied.
+ This treats the value so far as a parameter name (which may
+ include a subscript expression) and replaces that with the
+ corresponding value. This replacement occurs later if the `(P)'
+ flag appears in a nested substitution.
+
+ If the value so far names a parameter that has internal flags
+ (rule 2.), those internal flags are applied to the new value after
+ replacement.
+
+5. _Double-quoted joining_
+ If the value after this process is an array, and the substitution
+ appears in double quotes, and neither an `(@)' flag nor a `#'
+ length operator is present at the current level, then words of the
+ value are joined with the first character of the parameter $IFS,
+ by default a space, between each word (single word arrays are not
+ modified). If the `(j)' flag is present, that is used for joining
+ instead of $IFS.
+
+6. _Nested subscripting_
+ Any remaining subscripts (i.e. of a nested substitution) are
+ evaluated at this point, based on whether the value is an array or
+ a scalar. As with 3., multiple subscripts can appear. Note that
+ ${foo[2,4][2]} is thus equivalent to ${${foo[2,4]}[2]} and also to
+ "${${(@)foo[2,4]}[2]}" (the nested substitution returns an array in
+ both cases), but not to "${${foo[2,4]}[2]}" (the nested
+ substitution returns a scalar because of the quotes).
+
+7. _Modifiers_
+ Any modifiers, as specified by a trailing `#', `%', `/' (possibly
+ doubled) or by a set of modifiers of the form `:...' (see *Note
+ Modifiers:: in *Note History Expansion::), are applied to the words
+ of the value at this level.
+
+8. _Character evaluation_
+ Any `(#)' flag is applied, evaluating the result so far numerically
+ as a character.
+
+9. _Length_
+ Any initial `#' modifier, i.e. in the form ${#VAR}, is used to
+ evaluate the length of the expression so far.
+
+10. _Forced joining_
+ If the `(j)' flag is present, or no `(j)' flag is present but the
+ string is to be split as given by rule 11., and joining did not
+ take place at rule 5., any words in the value are joined together
+ using the given string or the first character of $IFS if none.
+ Note that the `(F)' flag implicitly supplies a string for joining
+ in this manner.
+
+11. _Simple word splitting_
+ If one of the `(s)' or `(f)' flags are present, or the `='
+ specifier was present (e.g. ${=VAR}), the word is split on
+ occurrences of the specified string, or (for = with neither of the
+ two flags present) any of the characters in $IFS.
+
+ If no `(s)', `(f)' or `=' was given, but the word is not quoted
+ and the option SH_WORD_SPLIT is set, the word is split on
+ occurrences of any of the characters in $IFS. Note this step, too,
+ takes place at all levels of a nested substitution.
+
+12. _Case modification_
+ Any case modification from one of the flags `(L)', `(U)' or `(C)'
+ is applied.
+
+13. _Escape sequence replacement_
+ First any replacements from the `(g)' flag are performed, then any
+ prompt-style formatting from the `(%)' family of flags is applied.
+
+14. _Quote application_
+ Any quoting or unquoting using `(q)' and `(Q)' and related flags
+ is applied.
+
+15. _Directory naming_
+ Any directory name substitution using `(D)' flag is applied.
+
+16. _Visibility enhancement_
+ Any modifications to make characters visible using the `(V)' flag
+ are applied.
+
+17. _Lexical word splitting_
+ If the '(z)' flag or one of the forms of the '(Z)' flag is
+ present, the word is split as if it were a shell command line, so
+ that quotation marks and other metacharacters are used to decide
+ what constitutes a word. Note this form of splitting is entirely
+ distinct from that described by rule 11.: it does not use $IFS, and
+ does not cause forced joining.
+
+18. _Uniqueness_
+ If the result is an array and the `(u)' flag was present, duplicate
+ elements are removed from the array.
+
+19. _Ordering_
+ If the result is still an array and one of the `(o)' or `(O)' flags
+ was present, the array is reordered.
+
+20. RC_EXPAND_PARAM
+ At this point the decision is made whether any resulting array
+ elements are to be combined element by element with surrounding
+ text, as given by either the RC_EXPAND_PARAM option or the `^'
+ flag.
+
+21. _Re-evaluation_
+ Any `(e)' flag is applied to the value, forcing it to be
+ re-examined for new parameter substitutions, but also for command
+ and arithmetic substitutions.
+
+22. _Padding_
+ Any padding of the value by the `(l.FILL.)' or `(r.FILL.)' flags
+ is applied.
+
+23. _Semantic joining_
+ In contexts where expansion semantics requires a single word to
+ result, all words are rejoined with the first character of IFS
+ between. So in `${(P)${(f)lines}}' the value of ${lines} is split
+ at newlines, but then must be joined again before the `(P)' flag
+ can be applied.
+
+ If a single word is not required, this rule is skipped.
+
+24. _Empty argument removal_
+ If the substitution does not appear in double quotes, any resulting
+ zero-length argument, whether from a scalar or an element of an
+ array, is elided from the list of arguments inserted into the
+ command line.
+
+ Strictly speaking, the removal happens later as the same happens
+ with other forms of substitution; the point to note here is simply
+ that it occurs after any of the above parameter operations.
+
+25. _Nested parameter name replacement_
+ If the `(P)' flag is present and rule 4. has not applied, the
+ value so far is treated as a parameter name (which may include a
+ subscript expression) and replaced with the corresponding value,
+ with internal flags (rule 2.) applied to the new value.
+
+
+
+14.3.3 Examples
+---------------
+
+The flag f is useful to split a double-quoted substitution line by
+line. For example, ${(f)"$(<FILE)"} substitutes the contents of FILE
+divided so that each line is an element of the resulting array.
+Compare this with the effect of $(<FILE) alone, which divides the file
+up by words, or the same inside double quotes, which makes the entire
+content of the file a single string.
+
+The following illustrates the rules for nested parameter expansions.
+Suppose that $foo contains the array (bar baz):
+
+
+"${(@)${foo}[1]}"
+ This produces the result b. First, the inner substitution
+ "${foo}", which has no array (@) flag, produces a single word
+ result "bar baz". The outer substitution "${(@)...[1]}" detects
+ that this is a scalar, so that (despite the `(@)' flag) the
+ subscript picks the first character.
+
+"${${(@)foo}[1]}"
+ This produces the result `bar'. In this case, the inner
+ substitution "${(@)foo}" produces the array `(bar baz)'. The outer
+ substitution "${...[1]}" detects that this is an array and picks
+ the first word. This is similar to the simple case "${foo[1]}".
+
+
+As an example of the rules for word splitting and joining, suppose $foo
+contains the array `(ax1 bx1)'. Then
+
+
+${(s/x/)foo}
+ produces the words `a', `1 b' and `1'.
+
+${(j/x/s/x/)foo}
+ produces `a', `1', `b' and `1'.
+
+${(s/x/)foo%%1*}
+ produces `a' and ` b' (note the extra space). As substitution
+ occurs before either joining or splitting, the operation first
+ generates the modified array (ax bx), which is joined to give "ax
+ bx", and then split to give `a', ` b' and `'. The final empty
+ string will then be elided, as it is not in double quotes.
+
+
+
+
+File: zsh.info, Node: Command Substitution, Next: Arithmetic Expansion, Prev: Parameter Expansion, Up: Expansion
+
+14.4 Command Substitution
+=========================
+
+A command enclosed in parentheses preceded by a dollar sign, like
+`$(...)', or quoted with grave accents, like ``...`', is replaced with
+its standard output, with any trailing newlines deleted. If the
+substitution is not enclosed in double quotes, the output is broken
+into words using the IFS parameter.
+
+The substitution `$(cat FOO)' may be replaced by the faster `$(<FOO)'.
+In this case FOO undergoes single word shell expansions (_parameter
+expansion_, _command substitution_ and _arithmetic expansion_), but not
+filename generation.
+
+If the option GLOB_SUBST is set, the result of any unquoted command
+substitution, including the special form just mentioned, is eligible for
+filename generation.
+
+
+
+
+File: zsh.info, Node: Arithmetic Expansion, Next: Brace Expansion, Prev: Command Substitution, Up: Expansion
+
+14.5 Arithmetic Expansion
+=========================
+
+A string of the form `$[EXP]' or `$((EXP))' is substituted with the
+value of the arithmetic expression EXP. EXP is subjected to _parameter
+expansion_, _command substitution_ and _arithmetic expansion_ before it
+is evaluated. See *Note Arithmetic Evaluation::.
+
+
+File: zsh.info, Node: Brace Expansion, Next: Filename Expansion, Prev: Arithmetic Expansion, Up: Expansion
+
+14.6 Brace Expansion
+====================
+
+A string of the form `FOO{XX,YY,ZZ}BAR' is expanded to the individual
+words `FOOXXBAR', `FOOYYBAR' and `FOOZZBAR'. Left-to-right order is
+preserved. This construct may be nested. Commas may be quoted in
+order to include them literally in a word.
+
+An expression of the form `{N1..N2}', where N1 and N2 are integers, is
+expanded to every number between N1 and N2 inclusive. If either number
+begins with a zero, all the resulting numbers will be padded with
+leading zeroes to that minimum width, but for negative numbers the -
+character is also included in the width. If the numbers are in
+decreasing order the resulting sequence will also be in decreasing
+order.
+
+An expression of the form `{N1..N2..N3}', where N1, N2, and N3 are
+integers, is expanded as above, but only every N3th number starting
+from N1 is output. If N3 is negative the numbers are output in reverse
+order, this is slightly different from simply swapping N1 and N2 in the
+case that the step N3 doesn't evenly divide the range. Zero padding
+can be specified in any of the three numbers, specifying it in the
+third can be useful to pad for example `{-99..100..01}' which is not
+possible to specify by putting a 0 on either of the first two numbers
+(i.e. pad to two characters).
+
+An expression of the form `{C1..C2}', where C1 and C2 are single
+characters (which may be multibyte characters), is expanded to every
+character in the range from C1 to C2 in whatever character sequence is
+used internally. For characters with code points below 128 this is US
+ASCII (this is the only case most users will need). If any intervening
+character is not printable, appropriate quotation is used to render it
+printable. If the character sequence is reversed, the output is in
+reverse order, e.g. `{d..a}' is substituted as `d c b a'.
+
+If a brace expression matches none of the above forms, it is left
+unchanged, unless the option BRACE_CCL (an abbreviation for `brace
+character class') is set. In that case, it is expanded to a list of
+the individual characters between the braces sorted into the order of
+the characters in the ASCII character set (multibyte characters are not
+currently handled). The syntax is similar to a [...] expression in
+filename generation: `-' is treated specially to denote a range of
+characters, but `^' or `!' as the first character is treated normally.
+For example, `{abcdef0-9}' expands to 16 words 0 1 2 3 4 5 6 7 8 9 a b
+c d e f.
+
+Note that brace expansion is not part of filename generation
+(globbing); an expression such as */{foo,bar} is split into two
+separate words */foo and */bar before filename generation takes place.
+In particular, note that this is liable to produce a `no match' error if
+_either_ of the two expressions does not match; this is to be contrasted
+with */(foo|bar), which is treated as a single pattern but otherwise
+has similar effects.
+
+To combine brace expansion with array expansion, see the ${^SPEC} form
+described in *Note Parameter Expansion:: above.
+
+
+
+
+File: zsh.info, Node: Filename Expansion, Next: Filename Generation, Prev: Brace Expansion, Up: Expansion
+
+14.7 Filename Expansion
+=======================
+
+Each word is checked to see if it begins with an unquoted `~'. If it
+does, then the word up to a `/', or the end of the word if there is no
+`/', is checked to see if it can be substituted in one of the ways
+described here. If so, then the `~' and the checked portion are
+replaced with the appropriate substitute value.
+
+A `~' by itself is replaced by the value of $HOME. A `~' followed by a
+`+' or a `-' is replaced by current or previous working directory,
+respectively.
+
+A `~' followed by a number is replaced by the directory at that
+position in the directory stack. `~0' is equivalent to `~+', and `~1'
+is the top of the stack. `~+' followed by a number is replaced by the
+directory at that position in the directory stack. `~+0' is equivalent
+to `~+', and `~+1' is the top of the stack. `~-' followed by a number
+is replaced by the directory that many positions from the bottom of the
+stack. `~-0' is the bottom of the stack. The PUSHD_MINUS option
+exchanges the effects of `~+' and `~-' where they are followed by a
+number.
+
+
+
+14.7.1 Dynamic named directories
+--------------------------------
+
+
+
+If the function zsh_directory_name exists, or the shell variable
+zsh_directory_name_functions exists and contains an array of function
+names, then the functions are used to implement dynamic directory
+naming. The functions are tried in order until one returns status
+zero, so it is important that functions test whether they can handle
+the case in question and return an appropriate status.
+
+A `~' followed by a string NAMSTR in unquoted square brackets is
+treated specially as a dynamic directory name. Note that the first
+unquoted closing square bracket always terminates NAMSTR. The shell
+function is passed two arguments: the string n (for name) and NAMSTR.
+It should either set the array reply to a single element which is the
+directory corresponding to the name and return status zero (executing
+an assignment as the last statement is usually sufficient), or it
+should return status non-zero. In the former case the element of reply
+is used as the directory; in the latter case the substitution is deemed
+to have failed. If all functions fail and the option NOMATCH is set,
+an error results.
+
+The functions defined as above are also used to see if a directory can
+be turned into a name, for example when printing the directory stack or
+when expanding %~ in prompts. In this case each function is passed two
+arguments: the string d (for directory) and the candidate for dynamic
+naming. The function should either return non-zero status, if the
+directory cannot be named by the function, or it should set the array
+reply to consist of two elements: the first is the dynamic name for the
+directory (as would appear within `~[...]'), and the second is the
+prefix length of the directory to be replaced. For example, if the
+trial directory is /home/myname/src/zsh and the dynamic name for
+/home/myname/src (which has 16 characters) is s, then the function sets
+
+
+ reply=(s 16)
+
+The directory name so returned is compared with possible static names
+for parts of the directory path, as described below; it is used if the
+prefix length matched (16 in the example) is longer than that matched
+by any static name.
+
+It is not a requirement that a function implements both n and d calls;
+for example, it might be appropriate for certain dynamic forms of
+expansion not to be contracted to names. In that case any call with
+the first argument d should cause a non-zero status to be returned.
+
+The completion system calls `zsh_directory_name c' followed by
+equivalent calls to elements of the array zsh_directory_name_functions,
+if it exists, in order to complete dynamic names for directories. The
+code for this should be as for any other completion function as
+described in *Note Completion System::.
+
+As a working example, here is a function that expands any dynamic names
+beginning with the string p: to directories below /home/pws/perforce.
+In this simple case a static name for the directory would be just as
+effective.
+
+
+ zsh_directory_name() {
+ emulate -L zsh
+ setopt extendedglob
+ local -a match mbegin mend
+ if [[ $1 = d ]]; then
+ # turn the directory into a name
+ if [[ $2 = (#b)(/home/pws/perforce/)([^/]##)* ]]; then
+ typeset -ga reply
+ reply=(p:$match[2] $(( ${#match[1]} + ${#match[2]} )) )
+ else
+ return 1
+ fi
+ elif [[ $1 = n ]]; then
+ # turn the name into a directory
+ [[ $2 != (#b)p:(?*) ]] && return 1
+ typeset -ga reply
+ reply=(/home/pws/perforce/$match[1])
+ elif [[ $1 = c ]]; then
+ # complete names
+ local expl
+ local -a dirs
+ dirs=(/home/pws/perforce/*(/:t))
+ dirs=(p:${^dirs})
+ _wanted dynamic-dirs expl 'dynamic directory' compadd -S\] -a dirs
+ return
+ else
+ return 1
+ fi
+ return 0
+ }
+
+
+14.7.2 Static named directories
+-------------------------------
+
+A `~' followed by anything not already covered consisting of any number
+of alphanumeric characters or underscore (`_'), hyphen (`-'), or dot
+(`.') is looked up as a named directory, and replaced by the value of
+that named directory if found. Named directories are typically home
+directories for users on the system. They may also be defined if the
+text after the `~' is the name of a string shell parameter whose value
+begins with a `/'. Note that trailing slashes will be removed from the
+path to the directory (though the original parameter is not modified).
+
+It is also possible to define directory names using the -d option to the
+hash builtin.
+
+When the shell prints a path (e.g. when expanding %~ in prompts or when
+printing the directory stack), the path is checked to see if it has a
+named directory as its prefix. If so, then the prefix portion is
+replaced with a `~' followed by the name of the directory. The shorter
+of the two ways of referring to the directory is used, i.e. either the
+directory name or the full path; the name is used if they are the same
+length. The parameters $PWD and $OLDPWD are never abbreviated in this
+fashion.
+
+
+
+14.7.3 `=' expansion
+--------------------
+
+If a word begins with an unquoted `=' and the EQUALS option is set, the
+remainder of the word is taken as the name of a command. If a command
+exists by that name, the word is replaced by the full pathname of the
+command.
+
+
+
+14.7.4 Notes
+------------
+
+Filename expansion is performed on the right hand side of a parameter
+assignment, including those appearing after commands of the typeset
+family. In this case, the right hand side will be treated as a
+colon-separated list in the manner of the PATH parameter, so that a `~'
+or an `=' following a `:' is eligible for expansion. All such
+behaviour can be disabled by quoting the `~', the `=', or the whole
+expression (but not simply the colon); the EQUALS option is also
+respected.
+
+If the option MAGIC_EQUAL_SUBST is set, any unquoted shell argument in
+the form `IDENTIFIER=EXPRESSION' becomes eligible for file expansion as
+described in the previous paragraph. Quoting the first `=' also
+inhibits this.
+
+
+
+
+File: zsh.info, Node: Filename Generation, Prev: Filename Expansion, Up: Expansion
+
+14.8 Filename Generation
+========================
+
+If a word contains an unquoted instance of one of the characters `*',
+`(', `|', `<', `[', or `?', it is regarded as a pattern for filename
+generation, unless the GLOB option is unset. If the EXTENDED_GLOB
+option is set, the `^' and `#' characters also denote a pattern;
+otherwise they are not treated specially by the shell.
+
+The word is replaced with a list of sorted filenames that match the
+pattern. If no matching pattern is found, the shell gives an error
+message, unless the NULL_GLOB option is set, in which case the word is
+deleted; or unless the NOMATCH option is unset, in which case the word
+is left unchanged.
+
+In filename generation, the character `/' must be matched explicitly;
+also, a `.' must be matched explicitly at the beginning of a pattern or
+after a `/', unless the GLOB_DOTS option is set. No filename
+generation pattern matches the files `.' or `..'. In other instances
+of pattern matching, the `/' and `.' are not treated specially.
+
+14.8.1 Glob Operators
+---------------------
+
+
+*
+ Matches any string, including the null string.
+
+?
+ Matches any character.
+
+[...]
+ Matches any of the enclosed characters. Ranges of characters can
+ be specified by separating two characters by a `-'. A `-' or `]'
+ may be matched by including it as the first character in the list. There
+ are also several named classes of characters, in the form
+ `[:NAME:]' with the following meanings. The first set use the
+ macros provided by the operating system to test for the given
+ character combinations, including any modifications due to local
+ language settings, see man page ctype(3):
+
+
+ [:alnum:]
+ The character is alphanumeric
+
+ [:alpha:]
+ The character is alphabetic
+
+ [:ascii:]
+ The character is 7-bit, i.e. is a single-byte character
+ without the top bit set.
+
+ [:blank:]
+ The character is a blank character
+
+ [:cntrl:]
+ The character is a control character
+
+ [:digit:]
+ The character is a decimal digit
+
+ [:graph:]
+ The character is a printable character other than whitespace
+
+ [:lower:]
+ The character is a lowercase letter
+
+ [:print:]
+ The character is printable
+
+ [:punct:]
+ The character is printable but neither alphanumeric nor
+ whitespace
+
+ [:space:]
+ The character is whitespace
+
+ [:upper:]
+ The character is an uppercase letter
+
+ [:xdigit:]
+ The character is a hexadecimal digit
+
+
+ Another set of named classes is handled internally by the shell and
+ is not sensitive to the locale:
+
+
+ [:IDENT:]
+ The character is allowed to form part of a shell identifier,
+ such as a parameter name
+
+ [:IFS:]
+ The character is used as an input field separator, i.e. is
+ contained in the IFS parameter
+
+ [:IFSSPACE:]
+ The character is an IFS white space character; see the
+ documentation for IFS in *Note Parameters Used By The Shell::.
+
+ [:INCOMPLETE:]
+ Matches a byte that starts an incomplete multibyte character.
+ Note that there may be a sequence of more than one bytes that
+ taken together form the prefix of a multibyte character. To
+ test for a potentially incomplete byte sequence, use the
+ pattern `[[:INCOMPLETE:]]*'. This will never match a
+ sequence starting with a valid multibyte character.
+
+ [:INVALID:]
+ Matches a byte that does not start a valid multibyte
+ character. Note this may be a continuation byte of an
+ incomplete multibyte character as any part of a multibyte
+ string consisting of invalid and incomplete multibyte
+ characters is treated as single bytes.
+
+ [:WORD:]
+ The character is treated as part of a word; this test is
+ sensitive to the value of the WORDCHARS parameter
+
+
+ Note that the square brackets are additional to those enclosing
+ the whole set of characters, so to test for a single alphanumeric
+ character you need `[[:alnum:]]'. Named character sets can be
+ used alongside other types, e.g. `[[:alpha:]0-9]'.
+
+[^...]
+[!...]
+ Like [...], except that it matches any character which is not in
+ the given set.
+
+<[X]-[Y]>
+ Matches any number in the range X to Y, inclusive. Either of the
+ numbers may be omitted to make the range open-ended; hence `<->'
+ matches any number. To match individual digits, the [...] form is
+ more efficient.
+
+ Be careful when using other wildcards adjacent to patterns of this
+ form; for example, <0-9>* will actually match any number
+ whatsoever at the start of the string, since the `<0-9>' will
+ match the first digit, and the `*' will match any others. This is
+ a trap for the unwary, but is in fact an inevitable consequence of
+ the rule that the longest possible match always succeeds.
+ Expressions such as `<0-9>[^[:digit:]]*' can be used instead.
+
+(...)
+ Matches the enclosed pattern. This is used for grouping. If the
+ KSH_GLOB option is set, then a `@', `*', `+', `?' or `!'
+ immediately preceding the `(' is treated specially, as detailed
+ below. The option SH_GLOB prevents bare parentheses from being
+ used in this way, though the KSH_GLOB option is still available.
+
+ Note that grouping cannot extend over multiple directories: it is
+ an error to have a `/' within a group (this only applies for
+ patterns used in filename generation). There is one exception: a
+ group of the form (PAT/)# appearing as a complete path segment can
+ match a sequence of directories. For example, foo/(a*/)#bar
+ matches foo/bar, foo/any/bar, foo/any/anyother/bar, and so on.
+
+X|Y
+ Matches either X or Y. This operator has lower precedence than
+ any other. The `|' character must be within parentheses, to avoid
+ interpretation as a pipeline. The alternatives are tried in order
+ from left to right.
+
+^X
+ (Requires EXTENDED_GLOB to be set.) Matches anything except the
+ pattern X. This has a higher precedence than `/', so `^foo/bar'
+ will search directories in `.' except `./foo' for a file named
+ `bar'.
+
+X~Y
+ (Requires EXTENDED_GLOB to be set.) Match anything that matches
+ the pattern X but does not match Y. This has lower precedence
+ than any operator except `|', so `*/*~foo/bar' will search for all
+ files in all directories in `.' and then exclude `foo/bar' if
+ there was such a match. Multiple patterns can be excluded by
+ `FOO~BAR~BAZ'. In the exclusion pattern (Y), `/' and `.' are not
+ treated specially the way they usually are in globbing.
+
+X#
+ (Requires EXTENDED_GLOB to be set.) Matches zero or more
+ occurrences of the pattern X. This operator has high precedence;
+ `12#' is equivalent to `1(2#)', rather than `(12)#'. It is an
+ error for an unquoted `#' to follow something which cannot be
+ repeated; this includes an empty string, a pattern already
+ followed by `##', or parentheses when part of a KSH_GLOB pattern
+ (for example, `!(FOO)#' is invalid and must be replaced by
+ `*(!(FOO))').
+
+X##
+ (Requires EXTENDED_GLOB to be set.) Matches one or more
+ occurrences of the pattern X. This operator has high precedence;
+ `12##' is equivalent to `1(2##)', rather than `(12)##'. No more
+ than two active `#' characters may appear together. (Note the
+ potential clash with glob qualifiers in the form `1(2##)' which
+ should therefore be avoided.)
+
+
+14.8.2 ksh-like Glob Operators
+------------------------------
+
+If the KSH_GLOB option is set, the effects of parentheses can be
+modified by a preceding `@', `*', `+', `?' or `!'. This character need
+not be unquoted to have special effects, but the `(' must be.
+
+
+@(...)
+ Match the pattern in the parentheses. (Like `(...)'.)
+
+*(...)
+ Match any number of occurrences. (Like `(...)#', except that
+ recursive directory searching is not supported.)
+
++(...)
+ Match at least one occurrence. (Like `(...)##', except that
+ recursive directory searching is not supported.)
+
+?(...)
+ Match zero or one occurrence. (Like `(|...)'.)
+
+!(...)
+ Match anything but the expression in parentheses. (Like
+ `(^(...))'.)
+
+
+14.8.3 Precedence
+-----------------
+
+The precedence of the operators given above is (highest) `^', `/', `~',
+`|' (lowest); the remaining operators are simply treated from left to
+right as part of a string, with `#' and `##' applying to the shortest
+possible preceding unit (i.e. a character, `?', `[...]', `<...>', or a
+parenthesised expression). As mentioned above, a `/' used as a
+directory separator may not appear inside parentheses, while a `|' must
+do so; in patterns used in other contexts than filename generation (for
+example, in case statements and tests within `[[...]]'), a `/' is not
+special; and `/' is also not special after a `~' appearing outside
+parentheses in a filename pattern.
+
+14.8.4 Globbing Flags
+---------------------
+
+There are various flags which affect any text to their right up to the
+end of the enclosing group or to the end of the pattern; they require
+the EXTENDED_GLOB option. All take the form (#X) where X may have one
+of the following forms:
+
+
+i
+ Case insensitive: upper or lower case characters in the pattern
+ match upper or lower case characters.
+
+l
+ Lower case characters in the pattern match upper or lower case
+ characters; upper case characters in the pattern still only match
+ upper case characters.
+
+I
+ Case sensitive: locally negates the effect of i or l from that
+ point on.
+
+b
+ Activate backreferences for parenthesised groups in the pattern;
+ this does not work in filename generation. When a pattern with a
+ set of active parentheses is matched, the strings matched by the
+ groups are stored in the array $match, the indices of the
+ beginning of the matched parentheses in the array $mbegin, and the
+ indices of the end in the array $mend, with the first element of
+ each array corresponding to the first parenthesised group, and so
+ on. These arrays are not otherwise special to the shell. The
+ indices use the same convention as does parameter substitution, so
+ that elements of $mend and $mbegin may be used in subscripts; the
+ KSH_ARRAYS option is respected. Sets of globbing flags are not
+ considered parenthesised groups; only the first nine active
+ parentheses can be referenced.
+
+ For example,
+
+
+ foo="a_string_with_a_message"
+ if [[ $foo = (a|an)_(#b)(*) ]]; then
+ print ${foo[$mbegin[1],$mend[1]]}
+ fi
+
+ prints `string_with_a_message'. Note that the first set of
+ parentheses is before the (#b) and does not create a backreference.
+
+ Backreferences work with all forms of pattern matching other than
+ filename generation, but note that when performing matches on an
+ entire array, such as ${ARRAY#PATTERN}, or a global substitution,
+ such as ${PARAM//PAT/REPL}, only the data for the last match
+ remains available. In the case of global replacements this may
+ still be useful. See the example for the m flag below.
+
+ The numbering of backreferences strictly follows the order of the
+ opening parentheses from left to right in the pattern string,
+ although sets of parentheses may be nested. There are special
+ rules for parentheses followed by `#' or `##'. Only the last
+ match of the parenthesis is remembered: for example, in `[[ abab =
+ (#b)([ab])# ]]', only the final `b' is stored in match[1]. Thus
+ extra parentheses may be necessary to match the complete segment:
+ for example, use `X((ab|cd)#)Y' to match a whole string of either
+ `ab' or `cd' between `X' and `Y', using the value of $match[1]
+ rather than $match[2].
+
+ If the match fails none of the parameters is altered, so in some
+ cases it may be necessary to initialise them beforehand. If some
+ of the backreferences fail to match -- which happens if they are
+ in an alternate branch which fails to match, or if they are
+ followed by # and matched zero times -- then the matched string is
+ set to the empty string, and the start and end indices are set to
+ -1.
+
+ Pattern matching with backreferences is slightly slower than
+ without.
+
+B
+ Deactivate backreferences, negating the effect of the b flag from
+ that point on.
+
+cN,M
+ The flag (#cN,M) can be used anywhere that the # or ## operators
+ can be used except in the expressions `(*/)#' and `(*/)##' in
+ filename generation, where `/' has special meaning; it cannot be
+ combined with other globbing flags and a bad pattern error occurs
+ if it is misplaced. It is equivalent to the form {N,M} in regular
+ expressions. The previous character or group is required to match
+ between N and M times, inclusive. The form (#cN) requires exactly
+ N matches; (#c,M) is equivalent to specifying N as 0; (#cN,)
+ specifies that there is no maximum limit on the number of matches.
+
+m
+ Set references to the match data for the entire string matched;
+ this is similar to backreferencing and does not work in filename
+ generation. The flag must be in effect at the end of the pattern,
+ i.e. not local to a group. The parameters $MATCH, $MBEGIN and
+ $MEND will be set to the string matched and to the indices of the
+ beginning and end of the string, respectively. This is most
+ useful in parameter substitutions, as otherwise the string matched
+ is obvious.
+
+ For example,
+
+
+ arr=(veldt jynx grimps waqf zho buck)
+ print ${arr//(#m)[aeiou]/${(U)MATCH}}
+
+ forces all the matches (i.e. all vowels) into uppercase, printing
+ `vEldt jynx grImps wAqf zhO bUck'.
+
+ Unlike backreferences, there is no speed penalty for using match
+ references, other than the extra substitutions required for the
+ replacement strings in cases such as the example shown.
+
+M
+ Deactivate the m flag, hence no references to match data will be
+ created.
+
+aNUM
+ Approximate matching: NUM errors are allowed in the string matched
+ by the pattern. The rules for this are described in the next
+ subsection.
+
+s, e
+ Unlike the other flags, these have only a local effect, and each
+ must appear on its own: `(#s)' and `(#e)' are the only valid
+ forms. The `(#s)' flag succeeds only at the start of the test
+ string, and the `(#e)' flag succeeds only at the end of the test
+ string; they correspond to `^' and `$' in standard regular
+ expressions. They are useful for matching path segments in
+ patterns other than those in filename generation (where path
+ segments are in any case treated separately). For example,
+ `*((#s)|/)test((#e)|/)*' matches a path segment `test' in any of
+ the following strings: test, test/at/start, at/end/test,
+ in/test/middle.
+
+ Another use is in parameter substitution; for example
+ `${array/(#s)A*Z(#e)}' will remove only elements of an array which
+ match the complete pattern `A*Z'. There are other ways of
+ performing many operations of this type, however the combination
+ of the substitution operations `/' and `//' with the `(#s)' and
+ `(#e)' flags provides a single simple and memorable method.
+
+ Note that assertions of the form `(^(#s))' also work, i.e. match
+ anywhere except at the start of the string, although this actually
+ means `anything except a zero-length portion at the start of the
+ string'; you need to use `(""~(#s))' to match a zero-length
+ portion of the string not at the start.
+
+q
+ A `q' and everything up to the closing parenthesis of the globbing
+ flags are ignored by the pattern matching code. This is intended
+ to support the use of glob qualifiers, see below. The result is
+ that the pattern `(#b)(*).c(#q.)' can be used both for globbing
+ and for matching against a string. In the former case, the
+ `(#q.)' will be treated as a glob qualifier and the `(#b)' will
+ not be useful, while in the latter case the `(#b)' is useful for
+ backreferences and the `(#q.)' will be ignored. Note that colon
+ modifiers in the glob qualifiers are also not applied in ordinary
+ pattern matching.
+
+u
+ Respect the current locale in determining the presence of multibyte
+ characters in a pattern, provided the shell was compiled with
+ MULTIBYTE_SUPPORT. This overrides the MULTIBYTE option; the
+ default behaviour is taken from the option. Compare U.
+ (Mnemonic: typically multibyte characters are from Unicode in the
+ UTF-8 encoding, although any extension of ASCII supported by the
+ system library may be used.)
+
+U
+ All characters are considered to be a single byte long. The
+ opposite of u. This overrides the MULTIBYTE option.
+
+
+For example, the test string fooxx can be matched by the pattern
+(#i)FOOXX, but not by (#l)FOOXX, (#i)FOO(#I)XX or ((#i)FOOX)X. The
+string (#ia2)readme specifies case-insensitive matching of readme with
+up to two errors.
+
+When using the ksh syntax for grouping both KSH_GLOB and EXTENDED_GLOB
+must be set and the left parenthesis should be preceded by @. Note
+also that the flags do not affect letters inside [...] groups, in other
+words (#i)[a-z] still matches only lowercase letters. Finally, note
+that when examining whole paths case-insensitively every directory must
+be searched for all files which match, so that a pattern of the form
+(#i)/foo/bar/... is potentially slow.
+
+
+
+14.8.5 Approximate Matching
+---------------------------
+
+When matching approximately, the shell keeps a count of the errors
+found, which cannot exceed the number specified in the (#aNUM) flags.
+Four types of error are recognised:
+
+
+1.
+ Different characters, as in fooxbar and fooybar.
+
+2.
+ Transposition of characters, as in banana and abnana.
+
+3.
+ A character missing in the target string, as with the pattern road
+ and target string rod.
+
+4.
+ An extra character appearing in the target string, as with stove
+ and strove.
+
+
+Thus, the pattern (#a3)abcd matches dcba, with the errors occurring by
+using the first rule twice and the second once, grouping the string as
+[d][cb][a] and [a][bc][d].
+
+Non-literal parts of the pattern must match exactly, including
+characters in character ranges: hence (#a1)??? matches strings of
+length four, by applying rule 4 to an empty part of the pattern, but not
+strings of length two, since all the ? must match. Other characters
+which must match exactly are initial dots in filenames (unless the
+GLOB_DOTS option is set), and all slashes in filenames, so that a/bc is
+two errors from ab/c (the slash cannot be transposed with another
+character). Similarly, errors are counted separately for
+non-contiguous strings in the pattern, so that (ab|cd)ef is two errors
+from aebf.
+
+When using exclusion via the ~ operator, approximate matching is
+treated entirely separately for the excluded part and must be activated
+separately. Thus, (#a1)README~READ_ME matches READ.ME but not READ_ME,
+as the trailing READ_ME is matched without approximation. However,
+(#a1)README~(#a1)READ_ME does not match any pattern of the form READ?ME
+as all such forms are now excluded.
+
+Apart from exclusions, there is only one overall error count; however,
+the maximum errors allowed may be altered locally, and this can be
+delimited by grouping. For example, (#a1)cat((#a0)dog)fox allows one
+error in total, which may not occur in the dog section, and the pattern
+(#a1)cat(#a0)dog(#a1)fox is equivalent. Note that the point at which
+an error is first found is the crucial one for establishing whether to
+use approximation; for example, (#a1)abc(#a0)xyz will not match
+abcdxyz, because the error occurs at the `x', where approximation is
+turned off.
+
+Entire path segments may be matched approximately, so that
+`(#a1)/foo/d/is/available/at/the/bar' allows one error in any path
+segment. This is much less efficient than without the (#a1), however,
+since every directory in the path must be scanned for a possible
+approximate match. It is best to place the (#a1) after any path
+segments which are known to be correct.
+
+
+
+14.8.6 Recursive Globbing
+-------------------------
+
+A pathname component of the form `(FOO/)#' matches a path consisting of
+zero or more directories matching the pattern FOO.
+
+As a shorthand, `**/' is equivalent to `(*/)#'; note that this
+therefore matches files in the current directory as well as
+subdirectories. Thus:
+
+
+ ls -ld -- (*/)#bar
+
+or
+
+
+ ls -ld -- **/bar
+
+does a recursive directory search for files named `bar' (potentially
+including the file `bar' in the current directory). This form does not
+follow symbolic links; the alternative form `***/' does, but is
+otherwise identical. Neither of these can be combined with other forms
+of globbing within the same path segment; in that case, the `*'
+operators revert to their usual effect.
+
+Even shorter forms are available when the option GLOB_STAR_SHORT is
+set. In that case if no / immediately follows a ** or *** they are
+treated as if both a / plus a further * are present. Hence:
+
+
+ setopt GLOBSTARSHORT
+ ls -ld -- **.c
+
+is equivalent to
+
+
+ ls -ld -- **/*.c
+
+14.8.7 Glob Qualifiers
+----------------------
+
+Patterns used for filename generation may end in a list of qualifiers
+enclosed in parentheses. The qualifiers specify which filenames that
+otherwise match the given pattern will be inserted in the argument list.
+
+If the option BARE_GLOB_QUAL is set, then a trailing set of parentheses
+containing no `|' or `(' characters (or `~' if it is special) is taken
+as a set of glob qualifiers. A glob subexpression that would normally
+be taken as glob qualifiers, for example `(^x)', can be forced to be
+treated as part of the glob pattern by doubling the parentheses, in
+this case producing `((^x))'.
+
+If the option EXTENDED_GLOB is set, a different syntax for glob
+qualifiers is available, namely `(#qX)' where X is any of the same glob
+qualifiers used in the other format. The qualifiers must still appear
+at the end of the pattern. However, with this syntax multiple glob
+qualifiers may be chained together. They are treated as a logical AND
+of the individual sets of flags. Also, as the syntax is unambiguous,
+the expression will be treated as glob qualifiers just as long any
+parentheses contained within it are balanced; appearance of `|', `(' or
+`~' does not negate the effect. Note that qualifiers will be
+recognised in this form even if a bare glob qualifier exists at the end
+of the pattern, for example `*(#q*)(.)' will recognise executable
+regular files if both options are set; however, mixed syntax should
+probably be avoided for the sake of clarity. Note that within
+conditions using the `[[' form the presence of a parenthesised
+expression (#q...) at the end of a string indicates that globbing
+should be performed; the expression may include glob qualifiers, but it
+is also valid if it is simply (#q). This does not apply to the right
+hand side of pattern match operators as the syntax already has special
+significance.
+
+A qualifier may be any one of the following:
+
+
+/
+ directories
+
+F
+ `full' (i.e. non-empty) directories. Note that the opposite sense
+ (^F) expands to empty directories and all non-directories. Use
+ (/^F) for empty directories.
+
+.
+ plain files
+
+@
+ symbolic links
+
+=
+ sockets
+
+p
+ named pipes (FIFOs)
+
+*
+ executable plain files (0100 or 0010 or 0001)
+
+%
+ device files (character or block special)
+
+%b
+ block special files
+
+%c
+ character special files
+
+r
+ owner-readable files (0400)
+
+w
+ owner-writable files (0200)
+
+x
+ owner-executable files (0100)
+
+A
+ group-readable files (0040)
+
+I
+ group-writable files (0020)
+
+E
+ group-executable files (0010)
+
+R
+ world-readable files (0004)
+
+W
+ world-writable files (0002)
+
+X
+ world-executable files (0001)
+
+s
+ setuid files (04000)
+
+S
+ setgid files (02000)
+
+t
+ files with the sticky bit (01000)
+
+fSPEC
+ files with access rights matching SPEC. This SPEC may be a octal
+ number optionally preceded by a `=', a `+', or a `-'. If none of
+ these characters is given, the behavior is the same as for `='.
+ The octal number describes the mode bits to be expected, if
+ combined with a `=', the value given must match the file-modes
+ exactly, with a `+', at least the bits in the given number must be
+ set in the file-modes, and with a `-', the bits in the number must
+ not be set. Giving a `?' instead of a octal digit anywhere in the
+ number ensures that the corresponding bits in the file-modes are
+ not checked, this is only useful in combination with `='.
+
+ If the qualifier `f' is followed by any other character anything
+ up to the next matching character (`[', `{', and `<' match `]',
+ `}', and `>' respectively, any other character matches itself) is
+ taken as a list of comma-separated SUB-SPECs. Each SUB-SPEC may be
+ either an octal number as described above or a list of any of the
+ characters `u', `g', `o', and `a', followed by a `=', a `+', or a
+ `-', followed by a list of any of the characters `r', `w', `x',
+ `s', and `t', or an octal digit. The first list of characters
+ specify which access rights are to be checked. If a `u' is given,
+ those for the owner of the file are used, if a `g' is given, those
+ of the group are checked, a `o' means to test those of other
+ users, and the `a' says to test all three groups. The `=', `+',
+ and `-' again says how the modes are to be checked and have the
+ same meaning as described for the first form above. The second
+ list of characters finally says which access rights are to be
+ expected: `r' for read access, `w' for write access, `x' for the
+ right to execute the file (or to search a directory), `s' for the
+ setuid and setgid bits, and `t' for the sticky bit.
+
+ Thus, `*(f70?)' gives the files for which the owner has read,
+ write, and execute permission, and for which other group members
+ have no rights, independent of the permissions for other users.
+ The pattern `*(f-100)' gives all files for which the owner does
+ not have execute permission, and `*(f:gu+w,o-rx:)' gives the files
+ for which the owner and the other members of the group have at
+ least write permission, and for which other users don't have read
+ or execute permission.
+
+eSTRING
++CMD
+ The STRING will be executed as shell code. The filename will be
+ included in the list if and only if the code returns a zero status
+ (usually the status of the last command).
+
+ In the first form, the first character after the `e' will be used
+ as a separator and anything up to the next matching separator will
+ be taken as the STRING; `[', `{', and `<' match `]', `}', and
+ `>', respectively, while any other character matches itself. Note
+ that expansions must be quoted in the STRING to prevent them from
+ being expanded before globbing is done. STRING is then executed
+ as shell code. The string globqual is appended to the array
+ zsh_eval_context the duration of execution.
+
+ During the execution of STRING the filename currently being tested
+ is available in the parameter REPLY; the parameter may be altered
+ to a string to be inserted into the list instead of the original
+ filename. In addition, the parameter reply may be set to an array
+ or a string, which overrides the value of REPLY. If set to an
+ array, the latter is inserted into the command line word by word.
+
+ For example, suppose a directory contains a single file `lonely'.
+ Then the expression `*(e:'reply=(${REPLY}{1,2})':)' will cause the
+ words `lonely1' and `lonely2' to be inserted into the command
+ line. Note the quoting of STRING.
+
+ The form +CMD has the same effect, but no delimiters appear around
+ CMD. Instead, CMD is taken as the longest sequence of characters
+ following the + that are alphanumeric or underscore. Typically
+ CMD will be the name of a shell function that contains the
+ appropriate test. For example,
+
+
+ nt() { [[ $REPLY -nt $NTREF ]] }
+ NTREF=reffile
+ ls -ld -- *(+nt)
+
+ lists all files in the directory that have been modified more
+ recently than reffile.
+
+dDEV
+ files on the device DEV
+
+l[-|+]CT
+ files having a link count less than CT (-), greater than CT (+),
+ or equal to CT
+
+U
+ files owned by the effective user ID
+
+G
+ files owned by the effective group ID
+
+uID
+ files owned by user ID ID if that is a number. Otherwise, ID
+ specifies a user name: the character after the `u' will be taken
+ as a separator and the string between it and the next matching
+ separator will be taken as a user name. The starting separators
+ `[', `{', and `<' match the final separators `]', `}', and `>',
+ respectively; any other character matches itself. The selected
+ files are those owned by this user. For example, `u:foo:' or
+ `u[foo]' selects files owned by user `foo'.
+
+gID
+ like uID but with group IDs or names
+
+a[Mwhms][-|+]N
+ files accessed exactly N days ago. Files accessed within the last
+ N days are selected using a negative value for N (-N). Files
+ accessed more than N days ago are selected by a positive N value
+ (+N). Optional unit specifiers `M', `w', `h', `m' or `s' (e.g.
+ `ah5') cause the check to be performed with months (of 30 days),
+ weeks, hours, minutes or seconds instead of days, respectively.
+ An explicit `d' for days is also allowed.
+
+ Any fractional part of the difference between the access time and
+ the current part in the appropriate units is ignored in the
+ comparison. For instance, `echo *(ah-5)' would echo files
+ accessed within the last five hours, while `echo *(ah+5)' would
+ echo files accessed at least six hours ago, as times strictly
+ between five and six hours are treated as five hours.
+
+m[Mwhms][-|+]N
+ like the file access qualifier, except that it uses the file
+ modification time.
+
+c[Mwhms][-|+]N
+ like the file access qualifier, except that it uses the file inode
+ change time.
+
+L[+|-]N
+ files less than N bytes (-), more than N bytes (+), or exactly N
+ bytes in length.
+
+ If this flag is directly followed by a _size specifier_ `k' (`K'),
+ `m' (`M'), or `p' (`P') (e.g. `Lk-50') the check is performed with
+ kilobytes, megabytes, or blocks (of 512 bytes) instead. (On some
+ systems additional specifiers are available for gigabytes, `g' or
+ `G', and terabytes, `t' or `T'.) If a size specifier is used a
+ file is regarded as "exactly" the size if the file size rounded up
+ to the next unit is equal to the test size. Hence `*(Lm1)'
+ matches files from 1 byte up to 1 Megabyte inclusive. Note also
+ that the set of files "less than" the test size only includes
+ files that would not match the equality test; hence `*(Lm-1)' only
+ matches files of zero size.
+
+^
+ negates all qualifiers following it
+
+-
+ toggles between making the qualifiers work on symbolic links (the
+ default) and the files they point to
+
+M
+ sets the MARK_DIRS option for the current pattern
+
+T
+ appends a trailing qualifier mark to the filenames, analogous to
+ the LIST_TYPES option, for the current pattern (overrides M)
+
+N
+ sets the NULL_GLOB option for the current pattern
+
+D
+ sets the GLOB_DOTS option for the current pattern
+
+n
+ sets the NUMERIC_GLOB_SORT option for the current pattern
+
+YN
+ enables short-circuit mode: the pattern will expand to at most N
+ filenames. If more than N matches exist, only the first N matches
+ in directory traversal order will be considered.
+
+ Implies oN when no oC qualifier is used.
+
+oC
+ specifies how the names of the files should be sorted. If C is n
+ they are sorted by name; if it is L they are sorted depending on
+ the size (length) of the files; if l they are sorted by the number
+ of links; if a, m, or c they are sorted by the time of the last
+ access, modification, or inode change respectively; if d, files in
+ subdirectories appear before those in the current directory at
+ each level of the search -- this is best combined with other
+ criteria, for example `odon' to sort on names for files within the
+ same directory; if N, no sorting is performed. Note that a, m,
+ and c compare the age against the current time, hence the first
+ name in the list is the youngest file. Also note that the
+ modifiers ^ and - are used, so `*(^-oL)' gives a list of all files
+ sorted by file size in descending order, following any symbolic
+ links. Unless oN is used, multiple order specifiers may occur to
+ resolve ties.
+
+ The default sorting is n (by name) unless the Y glob qualifier is
+ used, in which case it is N (unsorted).
+
+ oe and o+ are special cases; they are each followed by shell code,
+ delimited as for the e glob qualifier and the + glob qualifier
+ respectively (see above). The code is executed for each matched
+ file with the parameter REPLY set to the name of the file on entry
+ and globsort appended to zsh_eval_context. The code should modify
+ the parameter REPLY in some fashion. On return, the value of the
+ parameter is used instead of the file name as the string on which
+ to sort. Unlike other sort operators, oe and o+ may be repeated,
+ but note that the maximum number of sort operators of any kind
+ that may appear in any glob expression is 12.
+
+OC
+ like `o', but sorts in descending order; i.e. `*(^oc)' is the same
+ as `*(Oc)' and `*(^Oc)' is the same as `*(oc)'; `Od' puts files in
+ the current directory before those in subdirectories at each level
+ of the search.
+
+[BEG[,END]]
+ specifies which of the matched filenames should be included in the
+ returned list. The syntax is the same as for array subscripts. BEG
+ and the optional END may be mathematical expressions. As in
+ parameter subscripting they may be negative to make them count
+ from the last match backward. E.g.: `*(-OL[1,3])' gives a list of
+ the names of the three largest files.
+
+PSTRING
+ The STRING will be prepended to each glob match as a separate
+ word. STRING is delimited in the same way as arguments to the e
+ glob qualifier described above. The qualifier can be repeated;
+ the words are prepended separately so that the resulting command
+ line contains the words in the same order they were given in the
+ list of glob qualifiers.
+
+ A typical use for this is to prepend an option before all
+ occurrences of a file name; for example, the pattern `*(P:-f:)'
+ produces the command line arguments `-f FILE1 -f FILE2 ...'
+
+ If the modifier ^ is active, then STRING will be appended instead
+ of prepended. Prepending and appending is done independently so
+ both can be used on the same glob expression; for example by
+ writing `*(P:foo:^P:bar:^P:baz:)' which produces the command line
+ arguments `foo baz FILE1 bar ...'
+
+
+More than one of these lists can be combined, separated by commas. The
+whole list matches if at least one of the sublists matches (they are
+`or'ed, the qualifiers in the sublists are `and'ed). Some qualifiers,
+however, affect all matches generated, independent of the sublist in
+which they are given. These are the qualifiers `M', `T', `N', `D',
+`n', `o', `O' and the subscripts given in brackets (`[...]').
+
+If a `:' appears in a qualifier list, the remainder of the expression in
+parenthesis is interpreted as a modifier (see *Note Modifiers:: in
+*Note History Expansion::). Each modifier must be introduced by a
+separate `:'. Note also that the result after modification does not
+have to be an existing file. The name of any existing file can be
+followed by a modifier of the form `(:...)' even if no actual filename
+generation is performed, although note that the presence of the
+parentheses causes the entire expression to be subjected to any global
+pattern matching options such as NULL_GLOB. Thus:
+
+
+ ls -ld -- *(-/)
+
+lists all directories and symbolic links that point to directories, and
+
+
+ ls -ld -- *(-@)
+
+lists all broken symbolic links, and
+
+
+ ls -ld -- *(%W)
+
+lists all world-writable device files in the current directory, and
+
+
+ ls -ld -- *(W,X)
+
+lists all files in the current directory that are world-writable or
+world-executable, and
+
+
+ print -rC1 /tmp/foo*(u0^@:t)
+
+outputs the basename of all root-owned files beginning with the string
+`foo' in /tmp, ignoring symlinks, and
+
+
+ ls -ld -- *.*~(lex|parse).[ch](^D^l1)
+
+lists all files having a link count of one whose names contain a dot
+(but not those starting with a dot, since GLOB_DOTS is explicitly
+switched off) except for lex.c, lex.h, parse.c and parse.h.
+
+
+ print -rC1 b*.pro(#q:s/pro/shmo/)(#q.:s/builtin/shmiltin/)
+
+demonstrates how colon modifiers and other qualifiers may be chained
+together. The ordinary qualifier `.' is applied first, then the colon
+modifiers in order from left to right. So if EXTENDED_GLOB is set and
+the base pattern matches the regular file builtin.pro, the shell will
+print `shmiltin.shmo'.
+
+
+File: zsh.info, Node: Parameters, Next: Options, Prev: Expansion, Up: Top
+
+15 Parameters
+*************
+
+
+
+15.1 Description
+================
+
+A parameter has a name, a value, and a number of attributes. A name
+may be any sequence of alphanumeric characters and underscores, or the
+single characters `*', `@', `#', `?', `-', `$', or `!'. A parameter
+whose name begins with an alphanumeric or underscore is also referred
+to as a _variable_.
+
+The attributes of a parameter determine the _type_ of its value, often
+referred to as the parameter type or variable type, and also control
+other processing that may be applied to the value when it is referenced.
+The value type may be a _scalar_ (a string, an integer, or a floating
+point number), an array (indexed numerically), or an _associative_
+array (an unordered set of name-value pairs, indexed by name, also
+referred to as a _hash_).
+
+Named scalar parameters may have the _exported_, -x, attribute, to copy
+them into the process environment, which is then passed from the shell
+to any new processes that it starts. Exported parameters are called
+_environment variables_. The shell also _imports_ environment variables
+at startup time and automatically marks the corresponding parameters as
+exported. Some environment variables are not imported for reasons of
+security or because they would interfere with the correct operation of
+other shell features.
+
+Parameters may also be _special_, that is, they have a predetermined
+meaning to the shell. Special parameters cannot have their type changed
+or their readonly attribute turned off, and if a special parameter is
+unset, then later recreated, the special properties will be retained.
+
+To declare the type of a parameter, or to assign a string or numeric
+value to a scalar parameter, use the typeset builtin.
+
+The value of a scalar parameter may also be assigned by writing:
+
+ NAME=VALUE
+
+In scalar assignment, VALUE is expanded as a single string, in which
+the elements of arrays are joined together; filename expansion is not
+performed unless the option GLOB_ASSIGN is set.
+
+When the integer attribute, -i, or a floating point attribute, -E or
+-F, is set for NAME, the VALUE is subject to arithmetic evaluation.
+Furthermore, by replacing `=' with `+=', a parameter can be incremented
+or appended to. See *Note Array Parameters:: and *Note Arithmetic
+Evaluation:: for additional forms of assignment.
+
+Note that assignment may implicitly change the attributes of a
+parameter. For example, assigning a number to a variable in arithmetic
+evaluation may change its type to integer or float, and with
+GLOB_ASSIGN assigning a pattern to a variable may change its type to an
+array.
+
+To reference the value of a parameter, write `$NAME' or `${NAME}'. See
+*Note Parameter Expansion:: for complete details. That section also
+explains the effect of the difference between scalar and array
+assignment on parameter expansion.
+
+* Menu:
+
+* Array Parameters::
+* Positional Parameters::
+* Local Parameters::
+* Parameters Set By The Shell::
+* Parameters Used By The Shell::
+
+
+File: zsh.info, Node: Array Parameters, Next: Positional Parameters, Up: Parameters
+
+15.2 Array Parameters
+=====================
+
+To assign an array value, write one of:
+
+ set -A NAME VALUE ...
+
+ NAME=(VALUE ...)
+
+ NAME=([KEY]=VALUE ...)
+
+If no parameter NAME exists, an ordinary array parameter is created.
+If the parameter NAME exists and is a scalar, it is replaced by a new
+array.
+
+In the third form, KEY is an expression that will be evaluated in
+arithmetic context (in its simplest form, an integer) that gives the
+index of the element to be assigned with VALUE. In this form any
+elements not explicitly mentioned that come before the largest index to
+which a value is assigned are assigned an empty string. The indices
+may be in any order. Note that this syntax is strict: [ and ]= must
+not be quoted, and KEY may not consist of the unquoted string ]=, but
+is otherwise treated as a simple string. The enhanced forms of
+subscript expression that may be used when directly subscripting a
+variable name, described in the section Array Subscripts below, are not
+available.
+
+The syntaxes with and without the explicit key may be mixed. An
+implicit KEY is deduced by incrementing the index from the previously
+assigned element. Note that it is not treated as an error if latter
+assignments in this form overwrite earlier assignments.
+
+For example, assuming the option KSH_ARRAYS is not set, the following:
+
+
+ array=(one [3]=three four)
+
+causes the array variable array to contain four elements one, an empty
+string, three and four, in that order.
+
+In the forms where only VALUE is specified, full command line expansion
+is performed.
+
+In the [KEY]=VALUE form, both KEY and VALUE undergo all forms of
+expansion allowed for single word shell expansions (this does not
+include filename generation); these are as performed by the parameter
+expansion flag (e) as described in *Note Parameter Expansion::. Nested
+parentheses may surround VALUE and are included as part of the value,
+which is joined into a plain string; this differs from ksh which allows
+the values themselves to be arrays. A future version of zsh may
+support that. To cause the brackets to be interpreted as a character
+class for filename generation, and therefore to treat the resulting list
+of files as a set of values, quote the equal sign using any form of
+quoting. Example:
+
+ NAME=([a-z]'='*)
+
+To append to an array without changing the existing values, use one of
+the following:
+
+ NAME+=(VALUE ...)
+
+ NAME+=([KEY]=VALUE ...)
+
+In the second form KEY may specify an existing index as well as an
+index off the end of the old array; any existing value is overwritten by
+VALUE. Also, it is possible to use [KEY]+=VALUE to append to the
+existing value at that index.
+
+Within the parentheses on the right hand side of either form of the
+assignment, newlines and semicolons are treated the same as white space,
+separating individual VALUEs. Any consecutive sequence of such
+characters has the same effect.
+
+Ordinary array parameters may also be explicitly declared with:
+
+ typeset -a NAME
+
+Associative arrays _must_ be declared before assignment, by using:
+
+ typeset -A NAME
+
+When NAME refers to an associative array, the list in an assignment is
+interpreted as alternating keys and values:
+
+ set -A NAME KEY VALUE ...
+
+ NAME=(KEY VALUE ...)
+
+ NAME=([KEY]=VALUE ...)
+
+Note that only one of the two syntaxes above may be used in any given
+assignment; the forms may not be mixed. This is unlike the case of
+numerically indexed arrays.
+
+Every KEY must have a VALUE in this case. Note that this assigns to
+the entire array, deleting any elements that do not appear in the list.
+The append syntax may also be used with an associative array:
+
+ NAME+=(KEY VALUE ...)
+
+ NAME+=([KEY]=VALUE ...)
+
+This adds a new key/value pair if the key is not already present, and
+replaces the value for the existing key if it is. In the second form
+it is also possible to use [KEY]+=VALUE to append to the existing value
+at that key. Expansion is performed identically to the corresponding
+forms for normal arrays, as described above.
+
+To create an empty array (including associative arrays), use one of:
+
+ set -A NAME
+
+ NAME=()
+
+
+15.2.1 Array Subscripts
+-----------------------
+
+Individual elements of an array may be selected using a subscript. A
+subscript of the form `[EXP]' selects the single element EXP, where EXP
+is an arithmetic expression which will be subject to arithmetic
+expansion as if it were surrounded by `$((...))'. The elements are
+numbered beginning with 1, unless the KSH_ARRAYS option is set in which
+case they are numbered from zero.
+
+Subscripts may be used inside braces used to delimit a parameter name,
+thus `${foo[2]}' is equivalent to `$foo[2]'. If the KSH_ARRAYS option
+is set, the braced form is the only one that works, as bracketed
+expressions otherwise are not treated as subscripts.
+
+If the KSH_ARRAYS option is not set, then by default accesses to an
+array element with a subscript that evaluates to zero return an empty
+string, while an attempt to write such an element is treated as an
+error. For backward compatibility the KSH_ZERO_SUBSCRIPT option can be
+set to cause subscript values 0 and 1 to be equivalent; see the
+description of the option in *Note Description of Options::.
+
+The same subscripting syntax is used for associative arrays, except that
+no arithmetic expansion is applied to EXP. However, the parsing rules
+for arithmetic expressions still apply, which affects the way that
+certain special characters must be protected from interpretation. See
+_Subscript Parsing_ below for details.
+
+A subscript of the form `[*]' or `[@]' evaluates to all elements of an
+array; there is no difference between the two except when they appear
+within double quotes. `"$foo[*]"' evaluates to `"$foo[1] $foo[2]
+..."', whereas `"$foo[@]"' evaluates to `"$foo[1]" "$foo[2]" ...'. For
+associative arrays, `[*]' or `[@]' evaluate to all the values, in no
+particular order. Note that this does not substitute the keys; see the
+documentation for the `k' flag under *Note Parameter Expansion:: for
+complete details. When an array parameter is referenced as `$NAME'
+(with no subscript) it evaluates to `$NAME[*]', unless the KSH_ARRAYS
+option is set in which case it evaluates to `${NAME[0]}' (for an
+associative array, this means the value of the key `0', which may not
+exist even if there are values for other keys).
+
+A subscript of the form `[EXP1,EXP2]' selects all elements in the range
+EXP1 to EXP2, inclusive. (Associative arrays are unordered, and so do
+not support ranges.) If one of the subscripts evaluates to a negative
+number, say -N, then the Nth element from the end of the array is used.
+Thus `$foo[-3]' is the third element from the end of the array foo, and
+`$foo[1,-1]' is the same as `$foo[*]'.
+
+Subscripting may also be performed on non-array values, in which case
+the subscripts specify a substring to be extracted. For example, if
+FOO is set to `foobar', then `echo $FOO[2,5]' prints `ooba'. Note that
+some forms of subscripting described below perform pattern matching,
+and in that case the substring extends from the start of the match of
+the first subscript to the end of the match of the second subscript.
+For example,
+
+
+ string="abcdefghijklm"
+ print ${string[(r)d?,(r)h?]}
+
+prints `defghi'. This is an obvious generalisation of the rule for
+single-character matches. For a single subscript, only a single
+character is referenced (not the range of characters covered by the
+match).
+
+Note that in substring operations the second subscript is handled
+differently by the r and R subscript flags: the former takes the
+shortest match as the length and the latter the longest match. Hence
+in the former case a * at the end is redundant while in the latter case
+it matches the whole remainder of the string. This does not affect the
+result of the single subscript case as here the length of the match is
+irrelevant.
+
+
+
+15.2.2 Array Element Assignment
+-------------------------------
+
+A subscript may be used on the left side of an assignment like so:
+
+ NAME[EXP]=VALUE
+
+In this form of assignment the element or range specified by EXP is
+replaced by the expression on the right side. An array (but not an
+associative array) may be created by assignment to a range or element.
+Arrays do not nest, so assigning a parenthesized list of values to an
+element or range changes the number of elements in the array, shifting
+the other elements to accommodate the new values. (This is not
+supported for associative arrays.)
+
+This syntax also works as an argument to the typeset command:
+
+ typeset "NAME[EXP]"=VALUE
+
+The VALUE may _not_ be a parenthesized list in this case; only
+single-element assignments may be made with typeset. Note that quotes
+are necessary in this case to prevent the brackets from being
+interpreted as filename generation operators. The noglob precommand
+modifier could be used instead.
+
+To delete an element of an ordinary array, assign `()' to that element.
+To delete an element of an associative array, use the unset command:
+
+ unset "NAME[EXP]"
+
+
+15.2.3 Subscript Flags
+----------------------
+
+If the opening bracket, or the comma in a range, in any subscript
+expression is directly followed by an opening parenthesis, the string up
+to the matching closing one is considered to be a list of flags, as in
+`NAME[(FLAGS)EXP]'.
+
+The flags s, n and b take an argument; the delimiter is shown below as
+`:', but any character, or the matching pairs `(...)', `{...}',
+`[...]', or `<...>', may be used, but note that `<...>' can only be
+used if the subscript is inside a double quoted expression or a
+parameter substitution enclosed in braces as otherwise the expression is
+interpreted as a redirection.
+
+The flags currently understood are:
+
+
+w
+ If the parameter subscripted is a scalar then this flag makes
+ subscripting work on words instead of characters. The default word
+ separator is whitespace. When combined with the i or I flag, the
+ effect is to produce the index of the first character of the
+ first/last word which matches the given pattern; note that a failed
+ match in this case always yields 0.
+
+s:STRING:
+ This gives the STRING that separates words (for use with the w
+ flag). The delimiter character : is arbitrary; see above.
+
+p
+ Recognize the same escape sequences as the print builtin in the
+ string argument of a subsequent `s' flag.
+
+f
+ If the parameter subscripted is a scalar then this flag makes
+ subscripting work on lines instead of characters, i.e. with
+ elements separated by newlines. This is a shorthand for `pws:\n:'.
+
+r
+ Reverse subscripting: if this flag is given, the EXP is taken as a
+ pattern and the result is the first matching array element,
+ substring or word (if the parameter is an array, if it is a
+ scalar, or if it is a scalar and the `w' flag is given,
+ respectively). The subscript used is the number of the matching
+ element, so that pairs of subscripts such as `$foo[(r)??,3]' and
+ `$foo[(r)??,(r)f*]' are possible if the parameter is not an
+ associative array. If the parameter is an associative array, only
+ the value part of each pair is compared to the pattern, and the
+ result is that value.
+
+ If a search through an ordinary array failed, the search sets the
+ subscript to one past the end of the array, and hence
+ ${array[(r)PATTERN]} will substitute the empty string. Thus the
+ success of a search can be tested by using the (i) flag, for
+ example (assuming the option KSH_ARRAYS is not in effect):
+
+
+ [[ ${array[(i)pattern]} -le ${#array} ]]
+
+ If KSH_ARRAYS is in effect, the -le should be replaced by -lt.
+
+R
+ Like `r', but gives the last match. For associative arrays, gives
+ all possible matches. May be used for assigning to ordinary array
+ elements, but not for assigning to associative arrays. On
+ failure, for normal arrays this has the effect of returning the
+ element corresponding to subscript 0; this is empty unless one of
+ the options KSH_ARRAYS or KSH_ZERO_SUBSCRIPT is in effect.
+
+ Note that in subscripts with both `r' and `R' pattern characters
+ are active even if they were substituted for a parameter
+ (regardless of the setting of GLOB_SUBST which controls this
+ feature in normal pattern matching). The flag `e' can be added to
+ inhibit pattern matching. As this flag does not inhibit other
+ forms of substitution, care is still required; using a parameter
+ to hold the key has the desired effect:
+
+
+ key2='original key'
+ print ${array[(Re)$key2]}
+
+i
+ Like `r', but gives the index of the match instead; this may not be
+ combined with a second argument. On the left side of an
+ assignment, behaves like `r'. For associative arrays, the key
+ part of each pair is compared to the pattern, and the first
+ matching key found is the result. On failure substitutes the
+ length of the array plus one, as discussed under the description
+ of `r', or the empty string for an associative array.
+
+I
+ Like `i', but gives the index of the last match, or all possible
+ matching keys in an associative array. On failure substitutes 0,
+ or the empty string for an associative array. This flag is best
+ when testing for values or keys that do not exist.
+
+k
+ If used in a subscript on an associative array, this flag causes
+ the keys to be interpreted as patterns, and returns the value for
+ the first key found where EXP is matched by the key. Note this
+ could be any such key as no ordering of associative arrays is
+ defined. This flag does not work on the left side of an
+ assignment to an associative array element. If used on another
+ type of parameter, this behaves like `r'.
+
+K
+ On an associative array this is like `k' but returns all values
+ where EXP is matched by the keys. On other types of parameters
+ this has the same effect as `R'.
+
+n:EXPR:
+ If combined with `r', `R', `i' or `I', makes them give the Nth or
+ Nth last match (if EXPR evaluates to N). This flag is ignored
+ when the array is associative. The delimiter character : is
+ arbitrary; see above.
+
+b:EXPR:
+ If combined with `r', `R', `i' or `I', makes them begin at the Nth
+ or Nth last element, word, or character (if EXPR evaluates to N).
+ This flag is ignored when the array is associative. The delimiter
+ character : is arbitrary; see above.
+
+e
+ This flag causes any pattern matching that would be performed on
+ the subscript to use plain string matching instead. Hence
+ `${array[(re)*]}' matches only the array element whose value is *.
+ Note that other forms of substitution such as parameter
+ substitution are not inhibited.
+
+ This flag can also be used to force * or @ to be interpreted as a
+ single key rather than as a reference to all values. It may be
+ used for either purpose on the left side of an assignment.
+
+
+See _Parameter Expansion Flags_ (*Note Parameter Expansion::) for
+additional ways to manipulate the results of array subscripting.
+
+
+
+15.2.4 Subscript Parsing
+------------------------
+
+This discussion applies mainly to associative array key strings and to
+patterns used for reverse subscripting (the `r', `R', `i', etc. flags),
+but it may also affect parameter substitutions that appear as part of
+an arithmetic expression in an ordinary subscript.
+
+To avoid subscript parsing limitations in assignments to associative
+array elements, use the append syntax:
+
+
+ aa+=('key with "*strange*" characters' 'value string')
+
+The basic rule to remember when writing a subscript expression is that
+all text between the opening `[' and the closing `]' is interpreted _as
+if_ it were in double quotes (*Note Quoting::). However, unlike double
+quotes which normally cannot nest, subscript expressions may appear
+inside double-quoted strings or inside other subscript expressions (or
+both!), so the rules have two important differences.
+
+The first difference is that brackets (`[' and `]') must appear as
+balanced pairs in a subscript expression unless they are preceded by a
+backslash (`\'). Therefore, within a subscript expression (and unlike
+true double-quoting) the sequence `\[' becomes `[', and similarly `\]'
+becomes `]'. This applies even in cases where a backslash is not
+normally required; for example, the pattern `[^[]' (to match any
+character other than an open bracket) should be written `[^\[]' in a
+reverse-subscript pattern. However, note that `\[^\[\]' and even
+`\[^[]' mean the _same_ thing, because backslashes are always stripped
+when they appear before brackets!
+
+The same rule applies to parentheses (`(' and `)') and braces (`{' and
+`}'): they must appear either in balanced pairs or preceded by a
+backslash, and backslashes that protect parentheses or braces are
+removed during parsing. This is because parameter expansions may be
+surrounded by balanced braces, and subscript flags are introduced by
+balanced parentheses.
+
+The second difference is that a double-quote (`"') may appear as part
+of a subscript expression without being preceded by a backslash, and
+therefore that the two characters `\"' remain as two characters in the
+subscript (in true double-quoting, `\"' becomes `"'). However, because
+of the standard shell quoting rules, any double-quotes that appear must
+occur in balanced pairs unless preceded by a backslash. This makes it
+more difficult to write a subscript expression that contains an odd
+number of double-quote characters, but the reason for this difference is
+so that when a subscript expression appears inside true double-quotes,
+one can still write `\"' (rather than `\\\"') for `"'.
+
+To use an odd number of double quotes as a key in an assignment, use the
+typeset builtin and an enclosing pair of double quotes; to refer to the
+value of that key, again use double quotes:
+
+
+ typeset -A aa
+ typeset "aa[one\"two\"three\"quotes]"=QQQ
+ print "$aa[one\"two\"three\"quotes]"
+
+It is important to note that the quoting rules do not change when a
+parameter expansion with a subscript is nested inside another subscript
+expression. That is, it is not necessary to use additional backslashes
+within the inner subscript expression; they are removed only once, from
+the innermost subscript outwards. Parameters are also expanded from the
+innermost subscript first, as each expansion is encountered left to
+right in the outer expression.
+
+A further complication arises from a way in which subscript parsing is
+_not_ different from double quote parsing. As in true double-quoting,
+the sequences `\*', and `\@' remain as two characters when they appear
+in a subscript expression. To use a literal `*' or `@' as an
+associative array key, the `e' flag must be used:
+
+
+ typeset -A aa
+ aa[(e)*]=star
+ print $aa[(e)*]
+
+A last detail must be considered when reverse subscripting is performed.
+Parameters appearing in the subscript expression are first expanded and
+then the complete expression is interpreted as a pattern. This has two
+effects: first, parameters behave as if GLOB_SUBST were on (and it
+cannot be turned off); second, backslashes are interpreted twice, once
+when parsing the array subscript and again when parsing the pattern.
+In a reverse subscript, it's necessary to use _four_ backslashes to
+cause a single backslash to match literally in the pattern. For
+complex patterns, it is often easiest to assign the desired pattern to
+a parameter and then refer to that parameter in the subscript, because
+then the backslashes, brackets, parentheses, etc., are seen only when
+the complete expression is converted to a pattern. To match the value
+of a parameter literally in a reverse subscript, rather than as a
+pattern, use `${(q)NAME}' (*Note Parameter Expansion::) to quote the
+expanded value.
+
+Note that the `k' and `K' flags are reverse subscripting for an
+ordinary array, but are _not_ reverse subscripting for an associative
+array! (For an associative array, the keys in the array itself are
+interpreted as patterns by those flags; the subscript is a plain string
+in that case.)
+
+One final note, not directly related to subscripting: the numeric names
+of positional parameters (*Note Positional Parameters::) are parsed
+specially, so for example `$2foo' is equivalent to `${2}foo'.
+Therefore, to use subscript syntax to extract a substring from a
+positional parameter, the expansion must be surrounded by braces; for
+example, `${2[3,5]}' evaluates to the third through fifth characters of
+the second positional parameter, but `$2[3,5]' is the entire second
+parameter concatenated with the filename generation pattern `[3,5]'.
+
+
+
+
+File: zsh.info, Node: Positional Parameters, Next: Local Parameters, Prev: Array Parameters, Up: Parameters
+
+15.3 Positional Parameters
+==========================
+
+The positional parameters provide access to the command-line arguments
+of a shell function, shell script, or the shell itself; see *Note
+Invocation::, and also *Note Functions::. The parameter N, where N is
+a number, is the Nth positional parameter. The parameter `$0' is a
+special case, see *Note Parameters Set By The Shell::.
+
+The parameters *, @ and argv are arrays containing all the positional
+parameters; thus `$argv[N]', etc., is equivalent to simply `$N'. Note
+that the options KSH_ARRAYS or KSH_ZERO_SUBSCRIPT apply to these arrays
+as well, so with either of those options set, `${argv[0]}' is
+equivalent to `$1' and so on.
+
+Positional parameters may be changed after the shell or function starts
+by using the set builtin, by assigning to the argv array, or by direct
+assignment of the form `N=VALUE' where N is the number of the
+positional parameter to be changed. This also creates (with empty
+values) any of the positions from 1 to N that do not already have
+values. Note that, because the positional parameters form an array, an
+array assignment of the form `N=(VALUE ...)' is allowed, and has the
+effect of shifting all the values at positions greater than N by as
+many positions as necessary to accommodate the new values.
+
+
+
+
+File: zsh.info, Node: Local Parameters, Next: Parameters Set By The Shell, Prev: Positional Parameters, Up: Parameters
+
+15.4 Local Parameters
+=====================
+
+Shell function executions delimit scopes for shell parameters.
+(Parameters are dynamically scoped.) The typeset builtin, and its
+alternative forms declare, integer, local and readonly (but not
+export), can be used to declare a parameter as being local to the
+innermost scope.
+
+When a parameter is read or assigned to, the innermost existing
+parameter of that name is used. (That is, the local parameter hides
+any less-local parameter.) However, assigning to a non-existent
+parameter, or declaring a new parameter with export, causes it to be
+created in the _outer_most scope.
+
+Local parameters disappear when their scope ends. unset can be used to
+delete a parameter while it is still in scope; any outer parameter of
+the same name remains hidden.
+
+Special parameters may also be made local; they retain their special
+attributes unless either the existing or the newly-created parameter
+has the -h (hide) attribute. This may have unexpected effects: there
+is no default value, so if there is no assignment at the point the
+variable is made local, it will be set to an empty value (or zero in
+the case of integers). The following:
+
+
+ typeset PATH=/new/directory:$PATH
+
+is valid for temporarily allowing the shell or programmes called from
+it to find the programs in /new/directory inside a function.
+
+Note that the restriction in older versions of zsh that local parameters
+were never exported has been removed.
+
+
+
+
+File: zsh.info, Node: Parameters Set By The Shell, Next: Parameters Used By The Shell, Prev: Local Parameters, Up: Parameters
+
+15.5 Parameters Set By The Shell
+================================
+
+In the parameter lists that follow, the mark `<S>' indicates that the
+parameter is special. `<Z>' indicates that the parameter does not exist
+when the shell initializes in sh or ksh emulation mode.
+
+The following parameters are automatically set by the shell:
+
+
+! <S>
+ The process ID of the last command started in the background with
+ &, put into the background with the bg builtin, or spawned with
+ coproc.
+
+# <S>
+ The number of positional parameters in decimal. Note that some
+ confusion may occur with the syntax $#PARAM which substitutes the
+ length of PARAM. Use ${#} to resolve ambiguities. In particular,
+ the sequence `$#-...' in an arithmetic expression is interpreted as
+ the length of the parameter -, q.v.
+
+ARGC <S> <Z>
+ Same as #.
+
+$ <S>
+ The process ID of this shell. Note that this indicates the
+ original shell started by invoking zsh; all processes forked from
+ the shells without executing a new program, such as subshells
+ started by (...), substitute the same value.
+
+- <S>
+ Flags supplied to the shell on invocation or by the set or setopt
+ commands.
+
+* <S>
+ An array containing the positional parameters.
+
+argv <S> <Z>
+ Same as *. Assigning to argv changes the local positional
+ parameters, but argv is _not_ itself a local parameter. Deleting
+ argv with unset in any function deletes it everywhere, although
+ only the innermost positional parameter array is deleted (so * and
+ @ in other scopes are not affected).
+
+@ <S>
+ Same as argv[@], even when argv is not set.
+
+? <S>
+ The exit status returned by the last command.
+
+0 <S>
+ The name used to invoke the current shell, or as set by the -c
+ command line option upon invocation. If the FUNCTION_ARGZERO
+ option is set, $0 is set upon entry to a shell function to the
+ name of the function, and upon entry to a sourced script to the
+ name of the script, and reset to its previous value when the
+ function or script returns.
+
+status <S> <Z>
+ Same as ?.
+
+pipestatus <S> <Z>
+ An array containing the exit statuses returned by all commands in
+ the last pipeline.
+
+_ <S>
+ The last argument of the previous command. Also, this parameter
+ is set in the environment of every command executed to the full
+ pathname of the command.
+
+CPUTYPE
+ The machine type (microprocessor class or machine model), as
+ determined at run time.
+
+EGID <S>
+ The effective group ID of the shell process. If you have
+ sufficient privileges, you may change the effective group ID of
+ the shell process by assigning to this parameter. Also (assuming
+ sufficient privileges), you may start a single command with a
+ different effective group ID by `(EGID=GID; command)'
+
+ If this is made local, it is not implicitly set to 0, but may be
+ explicitly set locally.
+
+EUID <S>
+ The effective user ID of the shell process. If you have sufficient
+ privileges, you may change the effective user ID of the shell
+ process by assigning to this parameter. Also (assuming sufficient
+ privileges), you may start a single command with a different
+ effective user ID by `(EUID=UID; command)'
+
+ If this is made local, it is not implicitly set to 0, but may be
+ explicitly set locally.
+
+ERRNO <S>
+ The value of errno (see man page errno(3)) as set by the most
+ recently failed system call. This value is system dependent and
+ is intended for debugging purposes. It is also useful with the
+ zsh/system module which allows the number to be turned into a name
+ or message.
+
+FUNCNEST <S>
+ Integer. If greater than or equal to zero, the maximum nesting
+ depth of shell functions. When it is exceeded, an error is raised
+ at the point where a function is called. The default value is
+ determined when the shell is configured, but is typically 500.
+ Increasing the value increases the danger of a runaway function
+ recursion causing the shell to crash. Setting a negative value
+ turns off the check.
+
+GID <S>
+ The real group ID of the shell process. If you have sufficient
+ privileges, you may change the group ID of the shell process by
+ assigning to this parameter. Also (assuming sufficient
+ privileges), you may start a single command under a different
+ group ID by `(GID=GID; command)'
+
+ If this is made local, it is not implicitly set to 0, but may be
+ explicitly set locally.
+
+HISTCMD
+ The current history event number in an interactive shell, in other
+ words the event number for the command that caused $HISTCMD to be
+ read. If the current history event modifies the history, HISTCMD
+ changes to the new maximum history event number.
+
+HOST
+ The current hostname.
+
+LINENO <S>
+ The line number of the current line within the current script,
+ sourced file, or shell function being executed, whichever was
+ started most recently. Note that in the case of shell functions
+ the line number refers to the function as it appeared in the
+ original definition, not necessarily as displayed by the functions
+ builtin.
+
+LOGNAME
+ If the corresponding variable is not set in the environment of the
+ shell, it is initialized to the login name corresponding to the
+ current login session. This parameter is exported by default but
+ this can be disabled using the typeset builtin. The value is set
+ to the string returned by the man page getlogin(3) system call if
+ that is available.
+
+MACHTYPE
+ The machine type (microprocessor class or machine model), as
+ determined at compile time.
+
+OLDPWD
+ The previous working directory. This is set when the shell
+ initializes and whenever the directory changes.
+
+OPTARG <S>
+ The value of the last option argument processed by the getopts
+ command.
+
+OPTIND <S>
+ The index of the last option argument processed by the getopts
+ command.
+
+OSTYPE
+ The operating system, as determined at compile time.
+
+PPID <S>
+ The process ID of the parent of the shell. As for $$, the value
+ indicates the parent of the original shell and does not change in
+ subshells.
+
+PWD
+ The present working directory. This is set when the shell
+ initializes and whenever the directory changes.
+
+RANDOM <S>
+ A pseudo-random integer from 0 to 32767, newly generated each time
+ this parameter is referenced. The random number generator can be
+ seeded by assigning a numeric value to RANDOM.
+
+ The values of RANDOM form an intentionally-repeatable pseudo-random
+ sequence; subshells that reference RANDOM will result in identical
+ pseudo-random values unless the value of RANDOM is referenced or
+ seeded in the parent shell in between subshell invocations.
+
+SECONDS <S>
+ The number of seconds since shell invocation. If this parameter
+ is assigned a value, then the value returned upon reference will
+ be the value that was assigned plus the number of seconds since
+ the assignment.
+
+ Unlike other special parameters, the type of the SECONDS parameter
+ can be changed using the typeset command. Only integer and one of
+ the floating point types are allowed. For example, `typeset -F
+ SECONDS' causes the value to be reported as a floating point
+ number. The value is available to microsecond accuracy, although
+ the shell may show more or fewer digits depending on the use of
+ typeset. See the documentation for the builtin typeset in *Note
+ Shell Builtin Commands:: for more details.
+
+SHLVL <S>
+ Incremented by one each time a new shell is started.
+
+signals
+ An array containing the names of the signals. Note that with the
+ standard zsh numbering of array indices, where the first element
+ has index 1, the signals are offset by 1 from the signal number
+ used by the operating system. For example, on typical Unix-like
+ systems HUP is signal number 1, but is referred to as $signals[2].
+ This is because of EXIT at position 1 in the array, which is used
+ internally by zsh but is not known to the operating system.
+
+TRY_BLOCK_ERROR <S>
+ In an always block, indicates whether the preceding list of code
+ caused an error. The value is 1 to indicate an error, 0 otherwise.
+ It may be reset, clearing the error condition. See *Note Complex
+ Commands::
+
+TRY_BLOCK_INTERRUPT <S>
+ This variable works in a similar way to TRY_BLOCK_ERROR, but
+ represents the status of an interrupt from the signal SIGINT, which
+ typically comes from the keyboard when the user types ^C. If set
+ to 0, any such interrupt will be reset; otherwise, the interrupt is
+ propagated after the always block.
+
+ Note that it is possible that an interrupt arrives during the
+ execution of the always block; this interrupt is also propagated.
+
+TTY
+ The name of the tty associated with the shell, if any.
+
+TTYIDLE <S>
+ The idle time of the tty associated with the shell in seconds or
+ -1 if there is no such tty.
+
+UID <S>
+ The real user ID of the shell process. If you have sufficient
+ privileges, you may change the user ID of the shell by assigning
+ to this parameter. Also (assuming sufficient privileges), you may
+ start a single command under a different user ID by `(UID=UID;
+ command)'
+
+ If this is made local, it is not implicitly set to 0, but may be
+ explicitly set locally.
+
+USERNAME <S>
+ The username corresponding to the real user ID of the shell
+ process. If you have sufficient privileges, you may change the
+ username (and also the user ID and group ID) of the shell by
+ assigning to this parameter. Also (assuming sufficient
+ privileges), you may start a single command under a different
+ username (and user ID and group ID) by `(USERNAME=USERNAME;
+ command)'
+
+VENDOR
+ The vendor, as determined at compile time.
+
+zsh_eval_context <S> <Z> (ZSH_EVAL_CONTEXT <S>)
+ An array (colon-separated list) indicating the context of shell
+ code that is being run. Each time a piece of shell code that is
+ stored within the shell is executed a string is temporarily
+ appended to the array to indicate the type of operation that is
+ being performed. Read in order the array gives an indication of
+ the stack of operations being performed with the most immediate
+ context last.
+
+ Note that the variable does not give information on syntactic
+ context such as pipelines or subshells. Use $ZSH_SUBSHELL to
+ detect subshells.
+
+ The context is one of the following:
+ cmdarg
+ Code specified by the -c option to the command line that
+ invoked the shell.
+
+ cmdsubst
+ Command substitution using the `...` or $(...) construct.
+
+ equalsubst
+ File substitution using the =(...) construct.
+
+ eval
+ Code executed by the eval builtin.
+
+ evalautofunc
+ Code executed with the KSH_AUTOLOAD mechanism in order to
+ define an autoloaded function.
+
+ fc
+ Code from the shell history executed by the -e option to the
+ fc builtin.
+
+ file
+ Lines of code being read directly from a file, for example by
+ the source builtin.
+
+ filecode
+ Lines of code being read from a .zwc file instead of directly
+ from the source file.
+
+ globqual
+ Code executed by the e or + glob qualifier.
+
+ globsort
+ Code executed to order files by the o glob qualifier.
+
+ insubst
+ File substitution using the <(...) construct.
+
+ loadautofunc
+ Code read directly from a file to define an autoloaded
+ function.
+
+ outsubst
+ File substitution using the >(...) construct.
+
+ sched
+ Code executed by the sched builtin.
+
+ shfunc
+ A shell function.
+
+ stty
+ Code passed to stty by the STTY environment variable.
+ Normally this is passed directly to the system's stty command,
+ so this value is unlikely to be seen in practice.
+
+ style
+ Code executed as part of a style retrieved by the zstyle
+ builtin from the zsh/zutil module.
+
+ toplevel
+ The highest execution level of a script or interactive shell.
+
+ trap
+ Code executed as a trap defined by the trap builtin. Traps
+ defined as functions have the context shfunc. As traps are
+ asynchronous they may have a different hierarchy from other
+ code.
+
+ zpty
+ Code executed by the zpty builtin from the zsh/zpty module.
+
+ zregexparse-guard
+ Code executed as a guard by the zregexparse command from the
+ zsh/zutil module.
+
+ zregexparse-action
+ Code executed as an action by the zregexparse command from the
+ zsh/zutil module.
+
+
+ZSH_ARGZERO
+ If zsh was invoked to run a script, this is the name of the script.
+ Otherwise, it is the name used to invoke the current shell. This
+ is the same as the value of $0 when the POSIX_ARGZERO option is
+ set, but is always available.
+
+ZSH_EXECUTION_STRING
+ If the shell was started with the option -c, this contains the
+ argument passed to the option. Otherwise it is not set.
+
+ZSH_NAME
+ Expands to the basename of the command used to invoke this instance
+ of zsh.
+
+ZSH_PATCHLEVEL
+ The output of `git describe -tags -long' for the zsh repository
+ used to build the shell. This is most useful in order to keep
+ track of versions of the shell during development between releases;
+ hence most users should not use it and should instead rely on
+ $ZSH_VERSION.
+
+zsh_scheduled_events
+ See *Note The zsh/sched Module::.
+
+ZSH_SCRIPT
+ If zsh was invoked to run a script, this is the name of the script,
+ otherwise it is unset.
+
+ZSH_SUBSHELL
+ Readonly integer. Initially zero, incremented each time the shell
+ forks to create a subshell for executing code. Hence `(print
+ $ZSH_SUBSHELL)' and `print $(print $ZSH_SUBSHELL)' output 1, while
+ `( (print $ZSH_SUBSHELL) )' outputs 2.
+
+ZSH_VERSION
+ The version number of the release of zsh.
+
+