Ogni sysadmin ha una manciata di comandi che digita decine di volte al giorno: git status, ls -la, un ssh verso lo stesso host, un docker ps con lo stesso filtro. Se li scrivi ancora per intero ogni volta, stai buttando via minuti che in un anno diventano ore. Alias e funzioni in .bashrc (o .zshrc se usi zsh) risolvono il problema una volta per tutte.
Alias: scorciatoie per comandi fissi
Un alias sostituisce una stringa con un'altra prima che la shell la esegua. La sintassi è sempre la stessa:
alias nome='comando da eseguire'
Alcuni classici che vale la pena avere ovunque:
alias ll='ls -lah'
alias ..='cd ..'
alias ...='cd ../..'
alias grep='grep --color=auto'
alias df='df -h'
alias du='du -h'
alias free='free -h'
alias h='history'
alias c='clear'
Per git, che si digita in continuazione, pochi alias fanno risparmiare un numero enorme di tasti nell'arco di una giornata:
alias gs='git status'
alias ga='git add'
alias gc='git commit -m'
alias gp='git push'
alias gl='git log --oneline --graph --decorate -20'
alias gd='git diff'
Se lavori spesso con Docker o container:
alias dps='docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"'
alias dcu='docker compose up -d'
alias dcd='docker compose down'
alias dlogs='docker compose logs -f'
Alias con opzioni di sicurezza
Un uso spesso sottovalutato degli alias è aggiungere protezioni ai comandi distruttivi, così da doverle disattivare esplicitamente quando serve:
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
Con -i il comando chiede conferma prima di sovrascrivere o cancellare. Se in uno script serve il comportamento originale, si bypassa l'alias con il percorso completo (/bin/rm file) o col prefisso backslash (\rm file).
Quando l'alias non basta: le funzioni
Gli alias funzionano bene per sostituzioni semplici, ma non accettano logica né argomenti posizionati con criterio. Per quello servono le funzioni bash, definite nello stesso file:
nome_funzione() {
comando "$1"
}
Alcuni esempi che uso praticamente ogni giorno.
mkcd: crea una cartella e ci entri subito
mkcd() {
mkdir -p "$1" && cd "$1"
}
extract: decomprime qualunque archivio senza ricordare la sintassi
extract() {
if [ -f "$1" ]; then
case "$1" in
*.tar.bz2) tar xjf "$1" ;;
*.tar.gz) tar xzf "$1" ;;
*.tar) tar xf "$1" ;;
*.bz2) bunzip2 "$1" ;;
*.gz) gunzip "$1" ;;
*.zip) unzip "$1" ;;
*.rar) unrar x "$1" ;;
*.7z) 7z x "$1" ;;
*) echo "Formato non riconosciuto: $1" ;;
esac
else
echo "File non trovato: $1"
fi
}
backup: copia rapida con timestamp
backup() {
cp "$1" "$1.bak_$(date +%Y%m%d_%H%M%S)"
}
findproc: cerca un processo per nome senza sbattersi con ps e grep
findproc() {
ps aux | grep -i "$1" | grep -v grep
}
meteo: un esempio di funzione che richiama un comando esterno
meteo() {
curl -s "wttr.in/${1:-}"
}
Qui ${1:-} usa il primo argomento se presente, altrimenti una stringa vuota (wttr.in userà la tua posizione via IP).
Dove metterle: organizzare .bashrc
Riempire .bashrc di decine di alias lo rende presto illeggibile. Meglio separare le cose in un file dedicato, aggiungendo in fondo a ~/.bashrc:
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
Tutti gli alias e le funzioni personali vanno in ~/.bash_aliases, mentre .bashrc resta pulito e gestisce solo la configurazione generale della shell.
Applicare le modifiche senza riaprire il terminale
Dopo ogni modifica basta ricaricare il file corrente:
source ~/.bashrc
Molti definiscono un alias apposta per questo, tanto è frequente durante la messa a punto:
alias reload='source ~/.bashrc'
Portabilità tra bash e zsh
La sintassi di alias e funzioni qui descritta è identica in bash e zsh: puoi tenere lo stesso file ~/.bash_aliases e caricarlo da entrambi con la stessa riga source, sia da .bashrc che da .zshrc. Le uniche differenze da tenere a mente riguardano funzionalità avanzate come il completamento automatico o il globbing esteso, non la definizione di alias e funzioni in sé.
Verificare cosa è già definito
Per non ridefinire per errore qualcosa che esiste già:
alias # elenca tutti gli alias attivi
type nome_comando # dice se è un alias, una funzione, un binario o altro
Con type scopri subito, ad esempio, se ll è un alias tuo o se cd è stato ridefinito come funzione da qualche framework installato in precedenza (oh-my-zsh e simili ne aggiungono parecchi). Investire mezz'ora a costruire il proprio set di alias e funzioni si ripaga in pochi giorni di utilizzo quotidiano del terminale.