9. Aliasing — Zsh 5.9.999.3-test documentation

# 9. Aliasing

Often-used commands can be abbreviated with an alias:

Example 9.1: Simple command alias

    % alias uc=uncompress
    % ls
    hanoi.Z
    % uc hanoi
    % ls
    hanoi

or commands with certain desired options:

Example 9.2: Alias with fixed options

    % alias fm='finger -m'
    % fm root
    Login name: root                        In real life: Operator
    Directory: /                            Shell: /bin/csh
    On since May 19 10:41:15 on console     3 days 5 hours Idle Time
    No unread mail
    No Plan.

    % alias lock='lock -p -60000'
    % lock
    lock: /dev/ttyr4 on phoenix. timeout in 60000 minutes
    time now is Fri May 24 04:23:18 EDT 1991
    Key:

    % alias l='ls -AF'
    % l /
    .bash_history              kadb*
    .bashrc                    lib@
    .cshrc                     licensed/
    .exrc                      lost+found/
    .login                     macsyma
    ...

Aliases can also be used to replace old commands:

Example 9.3: Replace commands with aliases

    % alias grep=egrep ps=sps make=gmake
    % alias whoami='echo root'
    % whoami
    root

or to define new ones:

Example 9.4: New commands via aliases

    % cd /
    % alias sz='ls -l | sort -n +3 | tail -10'
    % sz
    drwxr-sr-x  7 bin          3072 May 23 11:59 etc
    drwxrwxrwx 26 root         5120 May 24 04:20 tmp
    drwxr-xr-x  2 root         8192 Dec 26 19:34 lost+found
    drwxr-sr-x  2 bin         14848 May 23 18:48 dev
    -r--r--r--  1 root       140520 Dec 26 20:08 boot
    -rwxr-xr-x  1 root       311172 Dec 26 20:08 kadb
    -rwxr-xr-x  1 root      1209695 Apr 16 15:33 vmunix.old
    -rwxr-xr-x  1 root      1209702 May 14 19:04 vmunix
    -rwxr-xr-x  1 root      1209758 May 21 12:23 vmunix.new.kernelmap.old
    -rwxr-xr-x  1 root      1711848 Dec 26 20:08 vmunix.org
    % cd
    % alias rable='ls -AFtrd *(R)' nrable='ls -AFtrd *(^R)'
    % rable
    README      func/       bin/        pub/        News/       src/
    nicecolors  etc/        scr/        tmp/        iris/       zsh*
    % nrable
    Mailboxes/  mail/       notes

(The pattern `*(R)` matches all readable files in the current directory, and `*(^R)` matches all unreadable files.)

Most other shells have aliases of this kind (command aliases). However, `zsh` also has global aliases, which are substituted anywhere on a line. Global aliases can be used to abbreviate frequently-typed usernames, hostnames, etc.

Example 9.5: Global alias with -g

    % alias -g me=pfalstad gun=egsirer mjm=maruchck
    % who | grep me
    pfalstad ttyp0   May 24 03:39   (mickey.Princeton)
    pfalstad ttyp5   May 24 03:42   (mickey.Princeton)
    % fm gun
    Login name: egsirer                     In real life: Emin Gun Sirer
    Directory: /u/egsirer                   Shell: /bin/sh
    Last login Thu May 23 19:05 on ttyq3 from bow.Princeton.ED
    New mail received Fri May 24 02:30:28 1991;
      unread since Fri May 24 02:30:27 1991
    % alias -g phx=phoenix.princeton.edu warc=wuarchive.wustl.edu
    % ftp warc
    Connected to wuarchive.wustl.edu.

Here are some more interesting uses.

Example 9.6: Global aliases for pipes

    % alias -g M='| more' GF='| fgrep -f ~/.friends'
    % who M   # pipes the output of who through more
    % who GF  # see if your friends are on
    % w GF    # see what your friends are doing

Another example makes use of `zsh`’s process substitution. If you run NIS, and you miss being able to do this:

Example 9.7: grep local passwd file

    % grep pfalstad /etc/passwd

you can define an alias that will seem more natural than `ypmatch pfalstad passwd`:

Example 9.8: Global alias for ypcat

    % alias -g PASS='<(ypcat passwd)'
    % grep pfalstad PASS
    pfalstad:*:3564:35:Paul John Falstad:/u/pfalstad:/usr/princeton/bin/zsh

If you’re really crazy, you can even call it `/etc/passwd`:

Example 9.9: Alias over /etc/passwd

    % alias -g /etc/passwd='<(ypcat passwd)'
    % grep pfalstad /etc/passwd
    pfalstad:*:3564:35:Paul John Falstad:/u/pfalstad:/usr/princeton/bin/zsh

The last example shows one of the perils of global aliases; they have a lot of potential to cause confusion. For example, if you defined a global alias called `|` (which is possible), `zsh` would begin to act very strangely; every pipe symbol would be replaced with the text of your alias. To some extent, global aliases are like macros in C; discretion is advised in using them and in choosing names for them. Using names in all caps is not a bad idea, especially for aliases which introduce shell metasyntax (like `M` and `GF` above).

Note that `zsh` aliases are not like csh aliases. The syntax for defining them is different, and they do not have arguments. All your favorite csh aliases will probably not work under `zsh`. For example, if you try:

Example 9.10: csh alias syntax fails

    alias rm mv '\!* /tmp/wastebasket'

no aliases will be defined, but `zsh` will not report an error. In csh, this line defines an alias that makes `rm` safe—files that are `rm`’d will be moved to a temporary directory instead of instantly destroyed. In `zsh`’s syntax, however, this line asks the shell to print any existing alias definitions for `rm`, `mv`, or `!* /tmp/wastebasket`. Since there are none, most likely, the shell will not print anything, although `alias` will return a nonzero exit code. The proper syntax is this:

Example 9.11: csh history in alias

    alias rm='mv \!* /tmp/wastebasket'

However, this won’t work either:

Example 9.12: History bang expands as glob

    % rm foo.dvi
    zsh: no matches found: !*

While this makes `rm` safe, it is certainly not what the user intended. In `zsh`, you must use a shell function for this:

Example 9.13: Safe rm as a function

    % unalias rm
    % rm () { mv $* /tmp/wastebasket }
    % rm foo.dvi
    % ls /tmp/wastebasket
    foo.dvi

While this is much cleaner and easier to read (I hope you will agree), it is not csh-compatible. Therefore, a script to convert csh aliases and variables has been provided. You should only need to use it once, to convert all your csh aliases and parameters to `zsh` format:

Example 9.14: Convert aliases with c2z

    % csh
    csh> alias
    l       ls -AF
    more    less
    on      last -2 !:1 ; who | grep !:1
    csh> exit
    % c2z >neat_zsh_aliases
    % cat neat_zsh_aliases
    alias l='ls -AF'
    alias more='less'
    on () { last -2 $1 ; who | grep $1 }
    ...

The first two aliases were converted to regular `zsh` aliases, while the third, since it needed to handle arguments, was converted to a function. `c2z` can convert most aliases to `zsh` format without any problems. However, if you’re using some really arcane csh tricks, or if you have an alias with a name like `do` (which is reserved in `zsh`), you may have to fix some of the aliases by hand.

The `c2z` script checks your csh setup, and produces a list of `zsh` commands which replicate your aliases and parameter settings as closely as possible. You could include its output in your startup file, `.zshrc`.