[ prev | next | top ]

## 9. Aliasing

Often-used commands can be abbreviated with an alias:

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

or commands with certain desired 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:

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

or to define new ones:

    % 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.

    % 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.

    % 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:

    % grep pfalstad /etc/passwd

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

    % 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`:

    % 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:

    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:

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

However, this won’t work either:

    % 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:

    % 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:

    % 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`.

[ prev | next | top ]