Capitolo 24. Alias

Un alias Bash, essenzialmente, non è niente più che una scorciatoia di tastiera, un'abbreviazione, un mezzo per evitare di digitare una lunga sequenza di comandi. Se, per esempio, si inserisce la riga alias lm="ls -l | more" nel file ~/.bashrc, ogni volta che verrà digitato lm da riga di comando, questo sarà automaticamente sostituito con ls -l | more. In questo modo si possono evitare lunghe digitazioni da riga di comando nonché dover ricordare combinazioni complesse di comandi ed opzioni. Impostare alias rm="rm -i" (modalità di cancellazione interattiva) può evitare moltissimi danni, perché impedisce di perdere inavvertitamente file importanti.

In uno script, gli alias hanno un'utilità molto limitata. Sarebbe alquanto bello se gli alias potessero assumere alcune delle funzionalità del preprocessore del C, come l'espansione di macro, ma sfortunatamente Bash non espande gli argomenti presenti nel corpo dell'alias. [1] Inoltre, uno script non è in grado di espandere l'alias stesso nei "costrutti composti", come gli enunciati if/then, i cicli e le funzioni. Un'ulteriore limitazione è rappresentata dal fatto che un alias non si espande ricorsivamente. Quasi invariabilmente, tutto quello che ci piacerebbe fosse fatto da un alias, può essere fatto molto più efficacemente con una funzione.

Esempio 24-1. Alias in uno script

#!/bin/bash
# alias.sh

shopt -s expand_aliases
#  È necessario impostare questa opzione, altrimenti lo script non espande 
#+ gli alias.


# Innazitutto, divertiamoci un po'.
alias Jesse_James='echo "\"Alias Jesse James\" era una commedia del 1959\
interpretata da Bob Hope."'
Jesse_James

echo; echo; echo;

alias ll="ls -l"
#  Per definire un alias si possono usare sia gli apici singoli (') che quelli 
#+ doppi (").

echo "Prova dell'alias \"ll\":"
ll /usr/X11R6/bin/mk*   #* L'alias funziona.

echo

directory=/usr/X11R6/bin/
prefisso=mk*  # Vediamo se il carattere jolly causa dei problemi.
echo "Variabili \"directory\" + \"prefisso\" = $directory$prefisso"
echo

alias lll="ls -l $directory$prefisso"

echo "Prova dell'alias \"lll\":"
lll           #  Lungo elenco di tutti i file presenti in /usr/X11R6/bin che 
              #+ iniziano con mk.
#  Un alias è in grado di gestire le variabili concatenate 
#+ - e anche il carattere jolly.



TRUE=1

echo

if [ TRUE ]
then
  alias rr="ls -l"
  echo "Prova dell'alias \"rr\" all'interno di un enunciato if/then:"
  rr /usr/X11R6/bin/mk*   #* Messaggio d'errore!
  # Gli alias non vengono espansi all'interno di enunciati composti.
  echo "Comunque, l'alias precedentemente espanso viene ancora riconosciuto:"
  ll /usr/X11R6/bin/mk*
fi  

echo

conto=0
while [ $conto -lt 3 ]
do
  alias rrr="ls -l"
  echo "Prova dell'alias \"rrr\" in un ciclo \"while\":"
  rrr /usr/X11R6/bin/mk*  #* Anche in questo caso l'alias non viene espanso.
                          #  alias.sh: line 61: rrr: command not found
  let conto+=1
done

echo; echo

alias xyz='cat $0'   # Lo script visualizza sé stesso.
                     # Notate il quoting forte.
xyz
#  Questo sembra funzionare,
#+ sebbene la documentazione Bash suggerisca il contrario.
#
#  In ogni caso, come ha evidenziato Steve Jacobson,
#+ il parametro "$0" viene espanso immediatamente alla 
#+ dichiarazione dell'alias.

exit 0

Il comando unalias elimina un alias precedentemente impostato.

Esempio 24-2. unalias: abilitare e disabilitare un alias

#!/bin/bash
# unalias.sh

shopt -s expand_aliases  # Abilita l'espansione degli alias.

alias llm='ls -al | more'
llm

echo

unalias llm              # Disabilita l'alias.
llm
# Dà un messaggio d'errore poiché 'llm' non viene più riconosciuto.

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

Note

[1]

Tuttavia, sembra che gli alias possano effettivamente espandere i parametri posizionali.