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.