mirror of
https://github.com/zsh-users/zsh
synced 2024-11-02 20:47:49 +00:00
b884853756
It is useful to have this distinction visually. This also uses `--format=%(refname:short)` directly with `git for-each-ref`.
470 lines
21 KiB
Text
470 lines
21 KiB
Text
-----------------
|
|
THE Z SHELL (ZSH)
|
|
-----------------
|
|
|
|
Version
|
|
-------
|
|
|
|
This is version 5.0.8 of the shell. This is a stable release.
|
|
There are no significant new features since 5.0.7, but there
|
|
are many bugfixes and some significant internal improvements, notably
|
|
a more predictable effect for keyboard interrupts and proper parsing
|
|
of $(...) expressions.
|
|
|
|
Installing Zsh
|
|
--------------
|
|
|
|
The instructions for compiling zsh are in the file INSTALL. You should
|
|
also check the file MACHINES in the top directory to see if there
|
|
are any special instructions for your particular architecture.
|
|
|
|
Note in particular the zsh/newuser module that guides new users through
|
|
setting basic shell options without the administrator's intervention. This
|
|
is turned on by default. See the section AUTOMATIC NEW USER CONFIGURATION
|
|
in INSTALL for configuration information.
|
|
|
|
Features
|
|
--------
|
|
|
|
Zsh is a shell with lots of features. For a list of some of these, see the
|
|
file FEATURES, and for the latest changes see NEWS. For more
|
|
details, see the documentation.
|
|
|
|
Incompatibilites between 5.0.7 and 5.0.8
|
|
----------------------------------------
|
|
|
|
Various arithmetic operations have changed, in particular with respect
|
|
to the choice of integer or floating point operations. The new
|
|
behaviour is intended to be more consistent, but is not compatible with
|
|
the old.
|
|
|
|
1) Previously, the modulus operation, `%', implicitly converted the
|
|
operation to integer and output an integer result, even if one
|
|
or both of the arguments were floating point. Now, the C math
|
|
library fmod() operator is used to implement the operation where
|
|
one of the arguments is floating point. For example:
|
|
|
|
Old behavour:
|
|
|
|
% print $(( 5.5 % 2 ))
|
|
1
|
|
|
|
New behaviour:
|
|
|
|
% print $(( 5.5 % 2 ))
|
|
1.5
|
|
|
|
|
|
2) Previously, assignments to variables assigned the correct type to
|
|
variables declared as floating point or integer, but this type was
|
|
not propagated to the value of the expression, as a C programmer
|
|
would naturally expect. Now, the type of the variable is propagated
|
|
so long as the variable is declared as a numeric type (however this
|
|
happened, e.g. the variable may have been implicitly typed by a
|
|
previous assignment). For example:
|
|
|
|
Old behaviour:
|
|
|
|
% integer var
|
|
% print $(( var = 5.5 / 2.0 ))
|
|
2.75
|
|
% print $var
|
|
2
|
|
|
|
New behaviour:
|
|
|
|
% integer var
|
|
% print $(( var = 5.5 / 2.0 ))
|
|
2
|
|
% print $var
|
|
2
|
|
|
|
|
|
3) Previously, the FORCE_FLOAT option only forced the use of floating
|
|
point in arithmetic expressions for integer constants, i.e. numbers
|
|
typed directly into the expression, but not for variables. Hence
|
|
an operation involving only integer variables (or string variables
|
|
containing integers) was not forced to be performed with floating point
|
|
arithmetic. Now, operations involving variables are also forced to
|
|
floating point. For example:
|
|
|
|
Old behaviour:
|
|
|
|
% unsetopt FORCE_FLOAT
|
|
% print $(( 1 / 2 ))
|
|
0
|
|
% integer i=1 j=2
|
|
% print $(( i / j ))
|
|
0
|
|
% setopt FORCE_FLOAT
|
|
% print $(( 1 / 2 ))
|
|
0.5
|
|
% print $(( i / j ))
|
|
0
|
|
|
|
New behaviour:
|
|
|
|
% unsetopt FORCE_FLOAT
|
|
% print $(( 1 / 2 ))
|
|
0
|
|
% integer i=1 j=2
|
|
% print $(( i / j ))
|
|
0
|
|
% setopt FORCE_FLOAT
|
|
% print $(( 1 / 2 ))
|
|
0.5
|
|
% print $(( i / j ))
|
|
0.5
|
|
|
|
|
|
4) The _git completion used to offer both local and remote heads under the
|
|
tag 'heads'. The tag has now been split into 'heads-local' and
|
|
'heads-remote' in all contexts that existed in 5.0.7. The --fixup/--squash
|
|
context still uses the tag 'heads' (but this may change in a future release).
|
|
|
|
|
|
Incompatibilities between 5.0.2 and 5.0.5
|
|
-----------------------------------------
|
|
|
|
The "zshaddhistory" hook mechanism documented in the zshmisc manual page
|
|
has been upgraded so that a hook returning status 2 causes a history
|
|
line to be saved on the internal history list but not written to the
|
|
history file. Previously any non-zero status return would cause
|
|
the line not to be saved on the history at all. It is recommended
|
|
to use status 1 for this (indeed most shell users would naturally do
|
|
so).
|
|
|
|
Incompatibilities between 5.0.0 and 5.0.2
|
|
-----------------------------------------
|
|
|
|
In 5.0.0, the new "sticky" emulation feature was applied to functions
|
|
explicitly declared within an expression following `emulate ... -c', but
|
|
did not apply to functions marked for autoload in that expression. This
|
|
was not documented and experience suggests it was inconvenient, so in
|
|
5.0.2 autoloads also have the sticky property.
|
|
|
|
In other words,
|
|
|
|
emulate zsh -c 'func() { ... }'
|
|
|
|
behaves the same way in 5.0.0 and 5.0.2, with the function func always being
|
|
run in native zsh emulation regardless of the current option settings.
|
|
However,
|
|
|
|
emulate zsh -c 'autoload -Uz func'
|
|
|
|
behaves differently: in 5.0.0, func was loaded with the options in
|
|
effect at the point where it was first run, and subsequently run with
|
|
whatever options were in effect at that point; in 5.0.2, func is loaded
|
|
with native zsh emulation options and run with those same options. This
|
|
is now the recommended way of ensuring a function is loaded and run with
|
|
a consistent set of options.
|
|
|
|
Note that the command `autoload -z' has never affected the options
|
|
applied when the function is loaded or run, only the effect of the
|
|
KSH_AUTOLOAD option at the point the function is loaded.
|
|
|
|
Possible incompatibilities between 4.2 and 5.0
|
|
----------------------------------------------
|
|
|
|
Here are some incompatibilities in the shell since the 4.2 series of
|
|
releases. It is hoped most users will not be adversely affected by these.
|
|
|
|
In previous releases of the shell, builtin commands and precommand
|
|
modifiers that did not accept options also did not recognize the
|
|
argument "--" as marking the end of option processing without being
|
|
considered an argument. This was not documented and was incompatible
|
|
with other shells. All such commands now handle this syntax.
|
|
|
|
The configuration option --enable-lfs to enable large file support has
|
|
been replaced by autoconf's standard --enable-largefile mechanism.
|
|
As this is usually used whenever necessary, this won't usually
|
|
be noticeable; however, anyone configuring with --disable-lfs
|
|
should configure with --disable-largefile instead.
|
|
|
|
The configuration option --with-curses-terminfo has been replaced
|
|
by the option --with-term-lib="LIBS" where LIBS is a space-separated
|
|
list of libraries to search for termcap and curses features.
|
|
|
|
The option SH_WORD_SPLIT, used in Bourne/Korn/Posix shell compatibility
|
|
mode, has been made more like other shells in the case of substitutions of
|
|
the form ${1+"$@"} (a common trick used to work around problems in older
|
|
Bourne shells) or any of the related forms with the + replaced by - or =
|
|
with an optional colon preceding. Previously, with SH_WORD_SPLIT in
|
|
effect, this expression would cause splitting on all white space in the
|
|
shell arguments. (This was always regarded as a bug but was long-standing
|
|
behaviour.) Now it is treated identically to "$@". The same change
|
|
applies to expressions with forced splitting such as ${=1+"$@"}, but
|
|
otherwise the case where SH_WORD_SPLIT is not set is unaffected.
|
|
|
|
Debug traps (`trap ... DEBUG' or the function TRAPDEBUG) now run by default
|
|
before the command to which they refer instead of after. This is almost
|
|
always the right behaviour for the intended purpose of debugging and is
|
|
consistent with recent versions of other shells. The option
|
|
DEBUG_BEFORE_CMD can be unset to revert to the previous behaviour.
|
|
|
|
Previously, process substitutions of the form =(...), <(...) and >(...)
|
|
were only handled if they appeared as separate command arguments.
|
|
(However, the latter two forms caused the current argument to be
|
|
terminated and a new one started even if they occurred in the middle of
|
|
a string.) Now all three may be followed by other strings, and the
|
|
latter two may also be preceded by other strings. Remaining
|
|
limitations on their use (to reduce incompatibilities to a minimum)
|
|
are documented in the zshexpn.1 manual.
|
|
|
|
In previous versions of the shell it was possible to use index 0 in an
|
|
array or string subscript to refer to the same element as index 1 if the
|
|
option KSH_ARRAYS was not in effect. This was a limited approximation to
|
|
the full KSH_ARRAYS handling and so was not very useful. In this version
|
|
of the shell, this behaviour is only provided when the option
|
|
KSH_ZERO_SUBSCRIPT is set. Note that despite the name this does not provide
|
|
true compatibility with ksh or other shells and KSH_ARRAYS should still be
|
|
used for that purpose. By default, the option is not set; an array
|
|
subscript that evaluates to 0 returns an empty string or array element and
|
|
attempts to write to an array or string range including only a zero
|
|
subscript are treated as an error. Writes to otherwise valid ranges that
|
|
also include index zero are allowed; hence for example the assignment
|
|
array[(R)notfound,(r)notfound]=()
|
|
(where the string "notfound" does not match an element in $array) sets the
|
|
entire array to be empty, as in previous versions of the shell.
|
|
KSH_ZERO_SUBSCRIPT is irrelevant when KSH_ARRAYS is set. Also as in previous
|
|
versions, attempts to write to non-existent elements at the end of an array
|
|
cause the array to be suitably extended. This difference means that, for
|
|
example
|
|
array[(R)notfound]=(replacement)
|
|
is an error if KSH_ZERO_SUBSCRIPT is not set (new behaviour), while
|
|
array[(r)notfound]=(replacement)
|
|
causes the given value to be appended to the array (same behaviour as
|
|
previous versions).
|
|
|
|
The "exec" precommand modifier now takes various options for compatibility
|
|
with other shells. This means that whereas "exec -prog" previously
|
|
tried to execute a command name "-prog", it will now report an error
|
|
in option handling. "exec -- -prog" will execute "-prog". If
|
|
the option EQUALS is set, as it is by default in zsh's native mode,
|
|
"exec =-prog" behaves the same way in all versions of zsh provided
|
|
the command can be found.
|
|
|
|
The "unset" builtin now does not regard the unsetting of non-existent
|
|
variables as an error, so can still return status 0 (depending on the
|
|
handling of other arguments). This appears to be the standard shell
|
|
behaviour.
|
|
|
|
The variable BAUD is no longer set automatically by the shell.
|
|
In previous versions it was set to the baud rate reported by
|
|
the terminal driver in order to initialise the line editor's
|
|
compensation mechanism for slow baud rates. However, the baud
|
|
rate so reported is very rarely related to the limiting speed of
|
|
screen updates on modern systems. Users who need the compensation
|
|
mechanism should set BAUD to an appropriate rate by hand.
|
|
|
|
The variable HOME is no longer set by the shell if zsh is emulating any
|
|
other shell at startup; it must be present in the environment or set
|
|
subsequently by the user. It is valid for the variable to be unset.
|
|
|
|
If the shell starts in a mode where it is emulating another shell
|
|
(typically because the base name of the shell was "sh" or another known
|
|
shell), the "repeat" syntax is not available by default, to avoid clashes
|
|
with external commands, but the "ulimit" command is available by default.
|
|
"limit", "sched" and "unlimit" are not available by default in such modes:
|
|
this has been the case for many versions but is now documented for the
|
|
first time. (Users should note that emulation modes are not designed for
|
|
backwards compatibility with previous versions of zsh, but to maximise
|
|
compatibility with other shells, hence it is not safe to assume emulation
|
|
modes will behave consistently between zsh versions.)
|
|
|
|
Parameter substitutions in the form ${param//#%search/replace} match
|
|
against "search" anchored at both ends of the parameter value. Previously
|
|
this syntax would have matched against "%search", anchored only at the head
|
|
of the value. The form ${param//#$search/replace} where the value
|
|
$search starts with "%" considers the "%" to be part of the search
|
|
string as before.
|
|
|
|
Configure attempts to decide if multibyte characters are supported by the
|
|
system and if so sets the effect of --enable-multibyte, unless
|
|
--disable-multibyte was passed on the command line. When
|
|
--enable-multibyte is in effect, the MULTIBYTE shell option is on by
|
|
default; this causes many operations to recognise characters in the current
|
|
locale. (Most typically this is used for a UTF-8 character set but the
|
|
shell will work with any character set provided by the system where
|
|
individual octets are either US ASCII characters or have the top bit set.)
|
|
Older versions of the shell always assumed a character was one byte; this
|
|
remains the case if --disable-multibyte is in effect or if the MULTIBYTE
|
|
option is unset. In some places the width of characters will be taken into
|
|
account where previously a raw string length was used; this is transparent
|
|
in calculations of screen position, but also occurs, for example, in
|
|
calculations of padding width. Note that MULTIBYTE is not automatically
|
|
set when emulating Bourne- and POSIX-style shells; for interactive use of
|
|
these emulations it may be necessary to set it by hand. Note also that the
|
|
option COMBINING_CHARS is not set by default due to difficulties detecting
|
|
the ability of the terminal to display combining characters correctly; MAC
|
|
users in particular will probably wish to set this option.
|
|
|
|
Zsh has previously been lax about whether it allows octets with the
|
|
top bit set to be part of a shell identifier. Older versions of the shell
|
|
assumed all such octets were allowed in identifiers, however the POSIX
|
|
standard does not allow such characters in identifiers. The older
|
|
behaviour is still obtained with --disable-multibyte in effect.
|
|
With --enable-multibyte in effect (see previous paragraph) there are three
|
|
possible cases:
|
|
MULTIBYTE option unset: only ASCII characters are allowed; the
|
|
shell does not attempt to identify non-ASCII characters at all.
|
|
MULTIBYTE option set, POSIX_IDENTIFIERS option unset: in addition
|
|
to the POSIX characters, any alphanumeric characters in the
|
|
local character set are allowed. Note that scripts and functions that
|
|
take advantage of this are non-portable; however, this is in the spirit
|
|
of previous versions of the shell. Note also that the options must
|
|
be set before the shell parses the script or function; setting
|
|
them during execution is not sufficient.
|
|
MULITBYTE option set, POSIX_IDENTIFIERS set: only ASCII characters
|
|
are allowed in identifiers even though the shell will recognise
|
|
alphanumeric multibyte characters.
|
|
|
|
The sched builtin now keeps entries in time order. This means that
|
|
after adding an entry the index of an existing entry used for deletion
|
|
may change, if that entry had a later time than the new entry. However,
|
|
deleting a entry with a later time will now never change the index of an
|
|
entry with an earlier time, which could happen with the previous method.
|
|
|
|
The completion style pine-directory must now be set to use completion
|
|
for PINE mailbox folders; previously it had the default ~/mail. This
|
|
change was necessary because otherwise recursive directories under
|
|
~/mail were searched by default, which could be a considerable unnecessary
|
|
hit for anyone not using PINE. The previous default can be restored with:
|
|
zstyle ':completion:*' pine-directory ~/mail
|
|
|
|
The completion style fake-files now allows patterns as directories,
|
|
for example the value '/home/*:.snapshot' is now valid. This will
|
|
only cause problems in the unlikely event that a directory in the style
|
|
has a pattern character in it.
|
|
|
|
The default maximum function depth (configurable with
|
|
--enable-max-function-depth) has been decreased to 1000 from 4096. The
|
|
previous value was observed to be small enough that crashes still occurred
|
|
on some fairly common PC configurations. This change is only likely to
|
|
affect some highly specialised uses of the shell.
|
|
|
|
The variables HISTCHARS and histchars now reject any attempt to
|
|
set non-ASCII characters for history or comments. Multibyte characters
|
|
have never worked and the most consistent change was to restrict the
|
|
set to portable characters only.
|
|
|
|
Writers of add-on modules should note that the API has changed
|
|
significantly to allow user control of individual features provided by
|
|
modules. See the documentation for zmodload -F and
|
|
Etc/zsh-development-guide, in that order.
|
|
|
|
Documentation
|
|
-------------
|
|
|
|
There are a number of documents about zsh in this distribution:
|
|
|
|
Doc/Zsh/*.yo The master source for the zsh documentation is written in
|
|
yodl. Yodl is a document language written by Karel Kubat.
|
|
It is not required by zsh but it is a nice program so you
|
|
might want to get it anyway, especially if you are a zsh
|
|
developer. It can be downloaded from
|
|
ftp://yodl.sourceforge.net/
|
|
|
|
Doc/zsh*.1 Man pages in nroff format. These will be installed
|
|
by "make install.man" or "make install". By default,
|
|
these will be installed in /usr/local/man/man1, although
|
|
you can change this with the --mandir option to configure
|
|
or editing the user configuration section of the top level
|
|
Makefile.
|
|
|
|
Doc/zsh.texi Everything the man pages have, but in texinfo format. These
|
|
will be installed by "make install.info" or "make install".
|
|
By default, these will be installed in /usr/local/info,
|
|
although you can change this with the --infodir option to
|
|
configure or editing the user configuration section of the
|
|
top level Makefile. Version 4.0 or above of the
|
|
Texinfo tools are recommended for processing this file.
|
|
|
|
Also included in the distribution are:
|
|
|
|
Doc/intro.ms An introduction to zsh in troff format using the ms
|
|
macros. This document explains many of the features
|
|
that make zsh more equal than other shells.
|
|
Unfortunately this is based on zsh-2.5 so some examples
|
|
may not work without changes but it is still a good
|
|
introduction.
|
|
|
|
For more information, see the website, as described in the META-FAQ.
|
|
|
|
If you do not have the necessary tools to process these documents, PDF,
|
|
Info and DVI versions are available in the separate file zsh-doc.tar.gz at
|
|
the archive sites listed in the META-FAQ.
|
|
|
|
The distribution also contains a Perl script in Utils/helpfiles which
|
|
can be used to extract the descriptions of builtin commands from the
|
|
zshbuiltins manual page. See the comments at the beginning of the
|
|
script about its usage. The files created by this script can be used
|
|
by example function run-help located in the subdirectory Functions/Misc to
|
|
show information about zsh builtins and run `man' on external commands.
|
|
For this the shell variable HELPDIR should point to a directory containing
|
|
the files generated by the helpfiles script. run-help should be
|
|
unaliased before loading the run-help function. After that this function
|
|
will be executed by the run-help ZLE function which is by default bound
|
|
to ESC-h in emacs mode.
|
|
|
|
Examples
|
|
--------
|
|
|
|
Examples of zsh startup files are located in the subdirectory
|
|
StartupFiles. Examples of zsh functions and scripts are located in
|
|
the subdirectory Functions. Examples of completion control commands
|
|
(compctl) are located in the file Misc/compctl-examples.
|
|
|
|
Zsh FTP Sites, Web Pages, and Mailing Lists
|
|
-------------------------------------------
|
|
|
|
The current list of zsh FTP sites, web pages, and mailing lists can be
|
|
found in the META-FAQ. A copy is included in this distribution and is
|
|
available separately at any of the zsh FTP sites.
|
|
|
|
Common Problems and Frequently Asked Questions
|
|
----------------------------------------------
|
|
|
|
Zsh has a list of Frequently Asked Questions (FAQ) maintained by Peter
|
|
Stephenson <pws@zsh.org>. It covers many common problems encountered
|
|
when building, installing, and using zsh. A copy is included in this
|
|
distribution in Etc/FAQ and is available separately at any of the zsh
|
|
ftp sites.
|
|
|
|
Zsh Maintenance and Bug Reports
|
|
-------------------------------
|
|
|
|
Zsh is currently maintained by the members of the zsh-workers mailing list
|
|
and coordinated by Peter Stephenson <coordinator@zsh.org>. Please send
|
|
any feedback and bugs reports to <zsh-workers@zsh.org>.
|
|
|
|
Reports are most helpful if you can reproduce the bug starting zsh with
|
|
the -f option. This skips the execution of local startup files except
|
|
/etc/zshenv. If a bug occurs only when some options set try to locate
|
|
the option which triggers the bug.
|
|
|
|
There is a script "reporter" in the subdirectory Util which will print out
|
|
your current shell environment/setup. If you cannot reproduce the bug
|
|
with "zsh -f", use this script and include the output from sourcing this
|
|
file. This way, the problem you are reporting can be recreated.
|
|
|
|
The known bugs in zsh are listed in the file Etc/BUGS. Check this as
|
|
well as the Frequently Asked Questions (FAQ) list before sending a bug
|
|
report. Note that zsh has some features which are not compatible with
|
|
sh but these are not bugs. Most of these incompatibilities go away
|
|
when zsh is invoked as sh or ksh (e.g. using a symbolic link).
|
|
|
|
If you send a bug report to the list and are not a subscriber, please
|
|
mention this in your message if you want a response.
|
|
|
|
If you would like to contribute to the development and maintenance of zsh,
|
|
then you should join the zsh-workers mailing list (check the META-FAQ
|
|
for info on this). You should also read the "zsh-development-guide"
|
|
located in the subdirectory Etc.
|
|
|
|
Contributors
|
|
------------
|
|
|
|
The people who have contributed to this software project are listed
|
|
in Etc/CONTRIBUTORS.
|