Advanced Bash-Scripting Guide: An in-depth exploration of the art of shell scripting
Prev |  | Next

# Chapter 25. Aliases

A Bash alias is essentially nothing more than a keyboard shortcut, an abbreviation, a means of avoiding typing a long command sequence. If, for example, we include alias lm="ls -l | more" in the `~/.bashrc` file, then each `lm` [1] typed at the command-line will automatically be replaced by a ls -l | more. This can save a great deal of typing at the command-line and avoid having to remember complex combinations of commands and options. Setting alias rm="rm -i" (interactive mode delete) may save a good deal of grief, since it can prevent inadvertently deleting important files.

In a script, aliases have very limited usefulness. It would be nice if aliases could assume some of the functionality of the C preprocessor, such as macro expansion, but unfortunately Bash does not expand arguments within the alias body. [2] Moreover, a script fails to expand an alias itself within "compound constructs," such as if/then statements, loops, and functions. An added limitation is that an alias will not expand recursively. Almost invariably, whatever we would like an alias to do could be accomplished much more effectively with a function.

Example 25-1. Aliases within a script

       1 #!/bin/bash
       2 # alias.sh
       3
       4 shopt -s expand_aliases
       5 # Must set this option, else script will not expand aliases.
       6
       7
       8 # First, some fun.
       9 alias Jesse_James='echo "\"Alias Jesse James\" was a 1959 comedy starring Bob Hope."'
      10 Jesse_James
      11
      12 echo; echo; echo;
      13
      14 alias ll="ls -l"
      15 # May use either single (') or double (") quotes to define an alias.
      16
      17 echo "Trying aliased \"ll\":"
      18 ll /usr/X11R6/bin/mk*   #* Alias works.
      19
      20 echo
      21
      22 directory=/usr/X11R6/bin/
      23 prefix=mk*  # See if wild card causes problems.
      24 echo "Variables \"directory\" + \"prefix\" = $directory$prefix"
      25 echo
      26
      27 alias lll="ls -l $directory$prefix"
      28
      29 echo "Trying aliased \"lll\":"
      30 lll         # Long listing of all files in /usr/X11R6/bin stating with mk.
      31 # An alias can handle concatenated variables -- including wild card -- o.k.
      32
      33
      34
      35
      36 TRUE=1
      37
      38 echo
      39
      40 if [ TRUE ]
      41 then
      42   alias rr="ls -l"
      43   echo "Trying aliased \"rr\" within if/then statement:"
      44   rr /usr/X11R6/bin/mk*   #* Error message results!
      45   # Aliases not expanded within compound statements.
      46   echo "However, previously expanded alias still recognized:"
      47   ll /usr/X11R6/bin/mk*
      48 fi
      49
      50 echo
      51
      52 count=0
      53 while [ $count -lt 3 ]
      54 do
      55   alias rrr="ls -l"
      56   echo "Trying aliased \"rrr\" within \"while\" loop:"
      57   rrr /usr/X11R6/bin/mk*   #* Alias will not expand here either.
      58                            #  alias.sh: line 57: rrr: command not found
      59   let count+=1
      60 done
      61
      62 echo; echo
      63
      64 alias xyz='cat $0'   # Script lists itself.
      65                      # Note strong quotes.
      66 xyz
      67 #  This seems to work,
      68 #+ although the Bash documentation suggests that it shouldn't.
      69 #
      70 #  However, as Steve Jacobson points out,
      71 #+ the "$0" parameter expands immediately upon declaration of the alias.
      72
      73 exit 0

The unalias command removes a previously set alias.

Example 25-2. unalias: Setting and unsetting an alias

       1 #!/bin/bash
       2 # unalias.sh
       3
       4 shopt -s expand_aliases  # Enables alias expansion.
       5
       6 alias llm='ls -al | more'
       7 llm
       8
       9 echo
      10
      11 unalias llm              # Unset alias.
      12 llm
      13 # Error message results, since 'llm' no longer recognized.
      14
      15 exit 0

     bash$ ./unalias.sh
     total 6
    drwxrwxr-x    2 bozo     bozo         3072 Feb  6 14:04 .
    drwxr-xr-x   40 bozo     bozo         2048 Feb  6 14:04 ..
    -rwxr-xr-x    1 bozo     bozo          199 Feb  6 14:04 unalias.sh

    ./unalias.sh: llm: command not found

### Notes

[1] | ... as the first word of a command string. Obviously, an alias is only meaningful at the beginning of a command.
[2] | However, aliases do seem to expand positional parameters.

Prev | Home | Next
Recursion Without Local Variables | Up | List Constructs