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
(see Section 3.23), then each lm
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 losing important files.
In a script, aliases have very limited usefulness. It would be
quite 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. Moreover,
a script fails to expand an alias itself within "compound
constructs", such as if/then
statements, loops, and functions. Almost invariably, whatever
we would like an alias to do could be accomplished much more
effectively with a function.
Example 3-85. Aliases within a script
#!/bin/bash2
shopt -s expand_aliases
# Must set this option, else script will not expand aliases.
# First, some fun.
alias Jesse_James='echo "\"Alias Jesse James\" was a 1959 comedy starring Bob Hope."'
Jesse_James
echo; echo; echo;
alias ll="ls -l"
# May use either single (') or double (") quotes to define an alias.
echo "Trying aliased \"ll\":"
ll /usr/X11R6/bin/mk* # Alias works.
echo
directory=/usr/X11R6/bin/
prefix=mk* # See if wild-card causes problems.
echo "Variables \"directory\" + \"prefix\" = $directory$prefix"
echo
alias lll="ls -l $directory$prefix"
echo "Trying aliased \"lll\":"
lll # Long listing of all files in /usr/X11R6/bin stating with mk.
# Alias handles concatenated variables, including wild-card o.k.
TRUE=1
echo
if [ TRUE ]
then
alias rr="ls -l"
echo "Trying aliased \"rr\" within if/then statement:"
rr /usr/X11R6/bin/mk* # Error message results!
# Aliases not expanded within compound statements.
echo "However, previously expanded alias still recognized:"
ll /usr/X11R6/bin/mk*
fi
echo
count=0
while [ $count -lt 3 ]
do
alias rrr="ls -l"
echo "Trying aliased \"rrr\" within \"while\" loop:"
rrr /usr/X11R6/bin/mk* # Alias will not expand here either.
let count+=1
done
exit 0 |
Note: The unalias command removes a previously
set alias.
Example 3-86. unalias: Setting and unsetting an alias
#!/bin/bash
shopt -s expand_aliases # Enables alias expansion.
alias llm='ls -al | more'
llm
echo
unalias llm # Unset alias.
llm
# Error message results, since 'llm' no longer recognized.
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 |