home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume35 / zsh / part13 / FAQ
Text File  |  1993-02-20  |  22KB  |  506 lines

  1. Archive-Name: zsh.FAQ
  2. Submitted-By: pws@s-a.amtp.liv.ac.uk (Peter Stephenson)
  3.  
  4. $Id: FAQ,v 1.3 1993/02/04 10:17:55 pws Exp pws $
  5.  
  6. This document contains a list of frequently-asked (or otherwise
  7. significant) questions concerning the Z-shell, a powerful command
  8. interpreter for many UNIX systems.
  9.  
  10. If you have never heard of `sh', `csh' or `ksh', then you are probably
  11. better off to start by reading a general introduction to UNIX rather
  12. than this document.
  13.  
  14. Another useful source of information is the collection of FAQ articles
  15. posted bi-weekly to the Usenet news groups comp.unix.questions,
  16. comp.unix.shells and news.answers with answers to general questions
  17. about UNIX.  The fifth of the seven articles deals with shells,
  18. including zsh, with a brief description of differences.  (This article
  19. also talks about shell startup files which would otherwise rate a
  20. mention here.)
  21.  
  22. If you just want to know how to get your hands on the latest version,
  23. skip to question 4; if you want to know what to do with insoluble
  24. problems, go to 17.
  25.  
  26. Notation: Quotes `like this' are ordinary textual quotation
  27. marks.  Other uses of quotation marks are input to the shell.
  28.  
  29. Contents:
  30. 1) What is it?
  31. 2) On what machines will it run?
  32. 3) What's the latest version?
  33. 4) Where do I get it?
  34. 5) How does zsh differ from sh, ksh, csh,...?
  35. 6) Why do my csh aliases not work?
  36. 7) How do I get the meta key to work on my xterm?
  37. 8) Why does my terminal act funny in way x?
  38. 9) Why does `$vble' where vble="foo bar" not do what I expect?
  39. 10) How does base arithmetic work?
  40. 11) How do I get a newline in my prompt?
  41. 12) Why does `bindkey ^a command-name' do something funny?
  42. 13) How do I reference command `foo' from within function `foo'?
  43. 14) I don't have root access: how do I make zsh my login shell?
  44. 15) What bugs are currently known and unfixed?
  45. 16) Where do I report bugs, get more info / who's working on zsh?
  46. 17) What's on the wish-list?
  47.  
  48.  
  49. 1) What is it?
  50.  
  51.   Zsh is a UNIX command interpreter (shell) which of the standard shells
  52.   most resembles the Korn shell (ksh), although it is not completely
  53.   compatible.  It includes enhancements of many types, notably in the
  54.   command-line editor, options for customising its behaviour, filename
  55.   globbing, features to make C-shell (csh) users feel more at home and
  56.   extra features drawn from tcsh (another `custom' shell).
  57.  
  58.   It was written by Paul Falstad <pf@ttisms.com> when a student at
  59.   Princeton; however, Paul doesn't maintain it any more and enquiries
  60.   should be sent to the mailing list (see question 17).  It is freely
  61.   available to anyone under unrestrictive conditions.
  62.  
  63.   For more information, the files doc/intro.txt or doc/intro.troff
  64.   included with the source distribution are highly recommended.  The
  65.   files intro.ps.Z and intro.txt.Z can also be FTP'd separately from the
  66.   archive (see 4).  A list of features is given in FEATURES, also with
  67.   the source.
  68.  
  69.  
  70. 2) On what machines will it run?
  71.  
  72.   Zsh was written for machines of the Berkeley UNIX family; most such
  73.   machines (and all the most popular) will run it without major surgery.
  74.   Modifications have been made so that it should work under SYSVR4-based
  75.   operating systems such as Solaris 2.x.  This best thing is to suck it
  76.   and see.  You may not have to change too much:  if you do change
  77.   anything,  arrange for the shell script `buildzsh' to set the
  78.   necessary #define's, etc., without human intervention.
  79.  
  80.  
  81. 3) What's the latest version?
  82.   
  83.   The latest production version is 2.3.1, which has just been released.
  84.   New patches occur frequently and are added to the archive (next
  85.   question).
  86.  
  87.  
  88. 4) Where do I get it?
  89.  
  90.   The current release is available for anonymous FTP from
  91.     cs.ucsd.edu (132.239.51.3):pub/zsh/zsh2.3.1.tar.Z
  92.   The archive maintainer currently is Jim Mattson <mattson@cs.UCSD.EDU>,
  93.   who also reads the mailing list.
  94.  
  95.   Bas de Bakker (bas@phys.uva.nl) will shortly be taking over the archive
  96.   and new patches are likely to be available from:
  97.     carlo.phys.uva.nl (145.18.220.25):/pub/bas/zsh
  98.   
  99.   Richard Ohnemus will probably have a North American reflector at
  100.   ftp.sterling.com.
  101.  
  102.  
  103. 5) How does zsh differ from sh, ksh, csh,...?
  104.  
  105.   As mentioned, zsh is most similar to ksh, while many of the additions are
  106.   to please csh users.
  107.  
  108.   i) ksh:
  109.   Most features of ksh are implemented in zsh; problems can arise
  110.   because the implementation is slightly different.  Note also not all
  111.   ksh's are the same either.  I have based this on SunOS 4, which is
  112.   essentially the 11/16/88 version of ksh.
  113.  
  114.   Differences from ksh which might prove significant for ksh
  115.   programmers, some of which may be interpreted as bugs (there must be
  116.   more) include:
  117.     Shell word splitting: see question 14.
  118.     Arrays are more csh-like than ksh-like:
  119.       subscripts start at 1, not 0; array[0] refers to array[1];
  120.       `$array' refers to the whole array, not $array[0];
  121.       braces are unnecessary: $a[1] == ${a[1]}, etc.
  122.     Path not searched for commands specified at invocation without -c.
  123.     Management of histories in multiple shells may be different.
  124.     Coprocesses are established by `coproc'; `|&' behaves like csh.
  125.     PS1 does not do parameter substitution.
  126.     Globbing does not allow ksh-style `pattern-lists'.
  127.     The options emacs, gmacs, privileged, trackall, viraw are not supported.
  128.     The `keyword' option does not exist and -k is instead interactivecomments.
  129.     [ ] is a shell built-in, rather than a call to /bin/test.
  130.     There is no built-in command newgrp: use a shell function.
  131.     The order in which aliases and functions are defined is significant.
  132.     Some built-ins (true, false, r, ...) were aliases in ksh.
  133.     Aliases and functions cannot be exported.
  134.     There are no tracked aliases.
  135.     There is no ENV variable.
  136.     No built-in commands cause automatic termination of a script.
  137.     The -- flag to terminate option processing is not recognised
  138.        as an argument to the shell (it is recognised by set).
  139.     `jobs' has no `-n' flag.
  140.     Treatment of backslashes within backquotes is different.
  141.     Variable assignments with tilde expansions are special-cased.
  142.     Editing:
  143.       \ does not escape editing chars (use ^V).
  144.       Not all ksh bindings are set (e.g. `<ESC>#').
  145.   The following is particularly near the feature/bug borderline:
  146.     To turn off signal traps, use `trap - <signo>', not `trap <signo>'.
  147.     "$@" always indicates at least one argument (older sh's do this too).
  148.  
  149.   ii) csh:
  150.  
  151.   Although certain features aim to ease the withdrawal symptoms of Csh
  152.   (ab)users, the syntax is in general rather different and you should
  153.   certainly not try to run scripts without modification.  The c2z script
  154.   is provided with the source (in scripts/c2z) to help convert .cshrc
  155.   and .login files; see also the next question concerning aliases.
  156.  
  157.   Csh-compatibility additions include:
  158.     Logout, rehash, source, (un)limit built-in commands.
  159.     *rc file for interactive shells.
  160.     Directory stacks.
  161.     Cshjunkie*, ignoreeof options.
  162.     The nonomatch option.
  163.     >&, |& etc. redirection.
  164.     foreach ... loops.
  165.     $PROMPT as well as $PS1, $status as well as $?, $#argv as well as $#, ....
  166.     Escape sequences via % for prompts.
  167.     Special array variables $PATH etc. are colon-separated, $path are arrays.
  168.     !-type history (which may be turned off).
  169.     Arrays have csh-like features (see i)).
  170.  
  171.   iii) tcsh:
  172.  
  173.   Certain features have been borrowed from tcsh, including $watch,
  174.   run-help, $savehist, $histlit, periodic commands etc., extended
  175.   prompts, sched and which/where built-ins.  This list is not
  176.   definitive: some features have gone in the other direction.
  177.  
  178.   iv) specific features:
  179.  
  180.   Things that zsh is particularly good at (no claim of exclusivity is made,
  181.   especially as shells copy one another) include:
  182.     Command line editing:
  183.       multi-line commands,
  184.       variable editing,
  185.       command buffer stack,
  186.       execution of unbound commands,
  187.       menu completion,
  188.       variable, host, editing function and option name completion,
  189.       inline expansion of variables, history commands,
  190.       path expansion (=foo).
  191.     Globbing:
  192.       recursive globbing (c.f find),
  193.       file attribute qualifiers,
  194.       full alternation and negation of patterns.
  195.     Large number of options for tailoring.
  196.     Adaptable messages for spelling, watch, time as well as prompt.
  197.     Named directories.
  198.     Comprehensive integer arithmetic.
  199.     Manipulation of arrays.
  200.     Spelling correction.
  201.  
  202.  
  203. 6) Why do my csh aliases not work?
  204.  
  205.   First of all, check you are using the syntax
  206.     alias newcmd='list of commands'
  207.   and not
  208.     alias newcmd 'list of commands'
  209.   which won't work. (It tells you if `newcmd' and `list of commands' are
  210.   already defined as aliases.)
  211.  
  212.   Otherwise, your aliases probably contain references to the command
  213.   line of the form `\!*', etc.  Zsh does not handle this behaviour as it
  214.   has shell functions which provide a way of solving this problem more
  215.   consistent with other forms of argument handling.  For example, the
  216.   csh alias
  217.     alias cd 'cd \!*; echo $cwd'
  218.   can be replaced by the zsh function,
  219.     cd() { builtin cd $*; echo $PWD; }
  220.   (the `builtin' tells zsh to use its own `cd', avoiding an infinite loop)
  221.   or, perhaps better,
  222.     cd() { builtin cd $*; print -D $PWD; }
  223.   (which converts your home directory to a ~).  In fact, this problem is
  224.   better solved by defining the special function chpwd() (see the manual).
  225.  
  226.   Note also that the `;' at the end of the function is optional in zsh,
  227.   but not in ksh or sh (for sh's where it exists).
  228.  
  229.   Here is Bart Schaefer's guide to converting csh aliases for zsh.
  230.  
  231.     1.  If the csh alias references "parameters" (\!:1 \!* etc.),
  232.         then in zsh you need a function (referencing $1 $* etc.).
  233.         Otherwise, you can use a zsh alias.
  234.  
  235.     2.  If you use a zsh function, you need to refer _at_least_ to
  236.         $* in the body (inside the { }).  Parameters don't magically
  237.         appear inside the { } the way they get appended to an alias.
  238.     
  239.     3.  If the csh alias references its own name (alias rm "rm -i"),
  240.         then in a zsh function you need the "command" keyword
  241.         (function rm() { command rm -i $* }), but in a zsh alias
  242.         you don't (alias rm="rm -i").
  243.  
  244.     4.  If you have aliases that refer to each other (alias ls "ls -C";
  245.         alias lf "ls -F" ==> lf == ls -C -F) then you must either:
  246.         a.  convert all of them to zsh functions; or
  247.         b.  after converting, be sure your .zshrc defines all of your
  248.             aliases before it defines any of your functions.
  249.  
  250.     Those first four are all you really need, but here are four more for
  251.     heavy csh alias junkies:
  252.  
  253.     5.  Mapping from csh alias "parameter referencing" into zsh function
  254.         (assuming shwordsplit is NOT set in zsh):
  255.              csh                   zsh
  256.             =====               ==========
  257.             \!*                 $*              (or $argv)
  258.             \!^                 $1              (or $argv[1])
  259.             \!:1                $1
  260.             \!:2                $2              (or $argv[2], etc.)
  261.             \!$                 $*[$#]          (or $argv[$#], or $*[-1])
  262.             \!:1-4              $*[1,4]
  263.             \!:1-               $*[1,$#-1]      (or $*[1,-2])
  264.             \!^-                $*[1,$#-1]
  265.             \!*:q               "$@"            ($*:q doesn't work (yet))
  266.             \!*:x               $=*             ($*:x doesn't work (yet))
  267.  
  268.     6.  Remember that it is NOT a syntax error in a zsh function to
  269.         refer to a position ($1, $2, etc.) greater than the number of
  270.         parameters. (E.g., in a csh alias, a reference to \!:5 will
  271.         cause an error if 4 or fewer arguments are given; in a zsh
  272.     function, $5 is the empty string if there are 4 or fewer
  273.     parameters.)
  274.  
  275.     7.  To begin a zsh alias with a - (dash, hyphen) character, use
  276.         "alias --":
  277.                  csh                            zsh
  278.             ===============             ==================
  279.             alias - "fg %-"             alias -- -="fg %-"
  280.  
  281.     8.  Stay away from "alias -g" in zsh until you REALLY know what
  282.         you're doing.
  283.  
  284.  
  285. 7) How do I get the meta key to work on my xterm?
  286.  
  287.   As stated in the manual, zsh needs to be told about the meta key by
  288.   using `bindkey -me' or `bindkey -mv' in your .zshrc or on the command
  289.   line.  You probably also need to tell the terminal driver to allow the
  290.   `meta' bit of the character through; `stty pass8' is the usual
  291.   incantation.  Sample .zshrc entry:
  292.     [[ $TERM = "xterm" ]] && stty pass8 && bindkey -me
  293.   Make sure this comes *before* any bindkey entries in your .zshrc which
  294.   redefine keys normally defined in the emacs/vi keymap.
  295.  
  296.  
  297. 8) Why does my terminal act funny in way x?
  298.  
  299.   If you are using an OpenWindows cmdtool as your terminal, any
  300.   escape sequences (such as those produced by cursor keys) will be
  301.   swallowed up and never reach zsh.  Either use shelltool or avoid
  302.   commands with escape sequences.  You can also disable scrolling from
  303.   the cmdtool pane menu (which effectively turns it into a shelltool).
  304.   If you still want scrolling, try using an xterm with the scrollbar
  305.   activated.
  306.  
  307.   If that's not the problem, and you are using stty to change some tty
  308.   settings, make sure you haven't asked zsh to freeze the tty settings:
  309.   type
  310.     ttyctl -u
  311.   before any stty commands you use.
  312.  
  313.   If _that's_ not the problem, and you are having difficulties with
  314.   external commands (not part of zsh), and you think some terminal
  315.   setting is wrong (e.g. ignpar should be -ignpar: see the stty(1)
  316.   manual page), try:
  317.     ttyctl -u
  318.     STTY='-ignpar' commandname
  319.   (in this not-very-useful example).  Note that zsh doesn't reset the
  320.   terminal completely afterwards: just the modes it uses itself.
  321.  
  322.  
  323. 9) Why does `$var' where var="foo bar" not do what I expect?
  324.  
  325.   In most Bourne-shell derivatives, multi-word variables such as
  326.     var="foo bar"
  327.   are split into words when passed to a command or used in a `for foo in $var'
  328.   loop.  By default, zsh does not have that behaviour:  the variable remains
  329.   intact.  An option (shwordsplit) exists to provide compatibility.
  330.   
  331.   For example, defining the function args to show the number of its
  332.   arguments:
  333.     args() { echo $#; }
  334.   and with our definition of vble,
  335.     args $vble
  336.   produces the output `1'.  After
  337.     setopt shwordsplit
  338.   the same function produces the output `2', like sh and ksh.
  339.   
  340.   Unless you need strict sh/ksh compatibility, you should ask yourself
  341.   whether you really want this behaviour, as it can produce unexpected
  342.   effects for variables with entirely innocuous embedded spaces.  The
  343.   natural way to produce word-splitting behaviour in zsh is via arrays.
  344.   For example,
  345.     set -A array one two three twenty
  346.   (or
  347.         array=(one two three twenty)
  348.   if you prefer), followed by
  349.     args $array
  350.   produces the output `4', regardless of the setting of shwordsplit.
  351.   Arrays are also much more versatile than single strings.
  352.   
  353.   Note also the "$@" method of word splitting is always available in zsh
  354.   functions and scripts (though strictly this does array splitting, not
  355.   word splitting), also the substitution ${=foo} to toggle word
  356.   splitting on variable `foo'.
  357.  
  358.  
  359. 10) How does base arithmetic work?
  360.  
  361.   The syntax (e.g. using the `let' builtin is)
  362.     let 'foo = [16]ff'
  363.   or equivalently
  364.     (( foo = [16]ff ))
  365.   Then
  366.     echo $foo
  367.   gives the answer `255'.  It is possible to declare variables explicitly
  368.   to be integers, via
  369.     typeset -i foo
  370.   which has a different effect: namely the base used in the first
  371.   assignment (hexadecimal in the example) is subsequently used whenever
  372.   `foo' is displayed (although the internal representation is unchanged).
  373.   To ensure foo is always displayed in decimal, declare it as
  374.     typeset -i 10 foo
  375.   which requests base 10 for output.  You can change the output base of an
  376.   existing variable in this fashion.  Using the `$[ ... ]' method will
  377.   always display in decimal.
  378.  
  379.  
  380. 11) How do I get a newline in my prompt?
  381.  
  382.   You can place a literal newline in quotes, i.e.
  383.     PROMPT="Hi Joe,
  384.     what now?%# "
  385.   If you have the bad taste to set the option cshjunkiequotes, which
  386.   inhibits such behaviour, you will have to bracket this with 
  387.   `unsetopt cshjunkiequotes' and `setopt cshjunkiequotes', or put it in
  388.   your .zshrc before the option is set.
  389.  
  390.  
  391. 12) Why does `bindkey ^a command-name' do something funny?
  392.  
  393.   You probably have the extendedglob option set in which case ^ and #
  394.   are metacharacters.  ^a matches any file except one called a, so the
  395.   line is interpreted as bindkey followed by a list of files.  Quote the
  396.   ^ with a backslash or put quotation marks around ^a.
  397.  
  398.  
  399. 13) How do I reference command `foo' from within function `foo'?
  400.  
  401.   The command `command foo' does just that.  You don't need this with
  402.   aliases, but you do with functions.  Note that the error message
  403.         zsh: job table full or recursion limit exceeded
  404.   is a good sign that you tried calling `foo' in function `foo' without
  405.   using `command'.
  406.  
  407.  
  408. 14) I don't have root access: how do I make zsh my login shell?
  409.  
  410.   Unfortunately, on many machines you can't use `chsh' to change your
  411.   shell unless the name of the shell is contained in /etc/shells, so if
  412.   you have your own copy of zsh you need some sleight-of-hand to use it
  413.   when you log on.  (Simply typing `zsh' is not really a solution since
  414.   you still have your original login shell waiting for when you exit.)
  415.   
  416.   The basic idea is to use `exec <zsh-path>' to replace the current
  417.   shell with zsh.  Often you can do this in a login file such as
  418.   .profile (if your shell is sh or ksh) or .login (if it's csh).  Make
  419.   sure you have some way of altering the file (e.g. via FTP) before you
  420.   try this as `exec' is often rather unforgiving.
  421.  
  422.   In .profile, try something like
  423.     [ -f $HOME/bin/zsh ] && exec $HOME/bin/zsh -l
  424.   and in .login, try something like
  425.     if ( -f ~/bin/zsh ) exec ~/bin/zsh -l
  426.   (in each case the -l tells zsh it is a login shell).  
  427.  
  428.   It's not a good idea to put this (even without the -l) into .cshrc, at
  429.   least without some tests on what the csh is supposed to be doing, as
  430.   that will cause _every_ instance of csh to turn into a zsh and will
  431.   cause csh scripts (yes, some people write these) to fail.  If you want
  432.   to tell xterm to run zsh, change the SHELL environment variable to the
  433.   full path of zsh.
  434.  
  435.   If you like your login shell to appear in the process list as '-zsh',
  436.   you can link zsh to -zsh (e.g. by `ln -s ~/bin/zsh ~/bin/-zsh') and
  437.   change the exec to `exec -zsh'.  (Make sure -zsh is in your path.)
  438.   This has the same effect as the `-l' option.
  439.  
  440.  
  441. 15) What bugs are currently known and unfixed?
  442.  
  443.   Here are some of the more well-known ones, very roughly in decreasing
  444.   order of significance.  A fuller bug list is now maintained by Carlos
  445.   Carvalho <carlos@snfep1.if.usp.br>. Many of these can also be counted
  446.   against differences from ksh in question 5).  Bugs marked [2.4] are
  447.   fixed in patches which should appear in early versions of the next
  448.   release.
  449.  
  450.   Unsetting multiply-named functions via a name other than the first
  451.     crashes the shell. [2.4]
  452.   Functions are a bit half-hearted about local variables. [2.4]
  453.   `return' in a trap simply returns from the trap. [2.4]
  454.   `return' in a shell script should act as `exit'.
  455.   Pipelines ending in a while/until/for loop are uninterruptible.
  456.   Certain built-ins won't allow the `VAR=value command ...' assignment.
  457.   The ones that do don't unset VAR after use.
  458.   Killing a command substitution in a loop doesn't kill the loop. [2.4]
  459.   Assigments in a typeset are overenthusiastic about tildes.
  460.   `bindkey -a -[ed]' modifies the alternate keymap.
  461.   `echo  !-2:$ !$' substitutes !-2:$ twice.
  462.   The :q modifier doesn't split words and -q and -x don't work for variables.
  463.   `echo -n ^V^J!<return>' causes a shell crash [2.4]
  464.   Command line editing in vi mode:
  465.     `.' doesn't repeat `x' (repeats command before `x').
  466.     `u' can go past original modification point.
  467.     `.' doesn't repeat count for `s', `cw', `dw', `r' (and others?).
  468.   If a command has both file and command completion enabled,
  469.     completion of a word that is a directory finds only commands in
  470.     the directory, not files and commands.
  471.   $_ returns the last unexpanded word from the previous line (not command).
  472.   Autocd won't use globbed filenames and sometimes refuses to work.
  473.   `if (( 1 )) command' and `if (( 1 )) { ...' do not work
  474.     (and related syntax problems).
  475.   The rmstar feature doesn't handle shell variables properly.
  476.  
  477.  
  478. 16) Where do I report bugs, get more info / who's working on zsh?
  479.  
  480.   Zsh is now maintained by a motley collection of enthusiasts who
  481.   subscribe to the mailing list, so any suggestions, complaints,
  482.   questions and matters for discussion should be addressed to:
  483.     zsh-list@cs.uow.edu.au
  484.   (if you want someone to mail you directly, say so).  If you wish to
  485.   subscribe to the mailing list, ask
  486.     zsh-request@cs.uow.edu.au
  487.   which is in the hands of Peter Gray, who also reads the list.  It is
  488.   by no means restricted to source-code hackers.
  489.  
  490.  
  491. 17) What's on the wish-list?
  492.  
  493.   `compctl' to be enhanced to shut up tcsh-users.
  494.   Option for glob qualifiers to follow perl syntax.
  495.   Selective expansion of history, variables, globs on <TAB>.
  496.   Option to quote !-history lexically via '' but not "" (hard).
  497.   Binding of external commands to zle functions (arg-passing mechanism??).
  498.   Ksh compatibility could be improved if required.
  499.  
  500.  
  501. Acknowledgments:
  502.  
  503. Thanks to zsh-list, in particular Bart Schaefer, for suggestions
  504. regarding this document; thanks to Jim Mattson for his hard work as
  505. archivist.
  506.