Cada comanda que escrius al terminal queda guardada a l’historial. La comanda history te’l mostra, i Bash t’ofereix unes quantes dreceres per recuperar, corregir i tornar a executar comandes anteriors sense haver-les d’escriure de nou. Si fas servir el terminal cada dia, aprendre’n quatre trucs t’estalvia moltíssim temps.
history és una comanda interna de Bash (també n’hi ha a zsh i altres shells, amb petites diferències). Tot el que hi ha en aquest post és per a Bash.
Com funciona l’historial
- Mentre treballes, l’historial de la sessió és a la memòria.
- Quan tanques la sessió, Bash el desa al fitxer
~/.bash_history. - Quan obres una sessió nova, el torna a llegir d’aquest fitxer.
Per això, si tens dos terminals oberts, l’un no veu les comandes de l’altre fins que no en tanques un i n’obres un de nou.
Sintaxi
history [n]
history -c | -d posició | -a | -w | -r
| Opció | Què fa |
|---|---|
| (cap) | Mostra tot l’historial numerat |
n | Mostra només les n darreres comandes |
-c | Esborra tot l’historial de la sessió |
-d posició | Esborra una entrada concreta (un número negatiu compta des del final) |
-a | Afegeix les comandes noves d’aquesta sessió al fitxer d’historial |
-w | Escriu tot l’historial de la sessió al fitxer (el sobreescriu) |
-r | Llegeix el fitxer d’historial i l’afegeix a la sessió |
Consultar l’historial
$ history 3
512 cd /var/log
513 sudo tail -f syslog
514 history 3
Per buscar una comanda concreta, filtra amb grep:
history | grep apt
Tornar a executar comandes
| Drecera | Què fa |
|---|---|
| Fletxa amunt / avall | Navega per l’historial |
Ctrl+R | Cerca enrere mentre escrius (torna a prémer Ctrl+R per anar a la coincidència anterior; Enter l’executa, Esc o una fletxa la deixa per editar) |
!! | Repeteix la darrera comanda |
!513 | Executa la comanda número 513 |
!-2 | Executa la penúltima comanda |
!tail | Executa la darrera comanda que comença per tail |
!$ | L’últim argument de la comanda anterior |
^vell^nou | Repeteix la darrera comanda canviant vell per nou |
Ctrl+R és, de lluny, la més pràctica. I la combinació més famosa és aquesta:
$ apt update
...
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
$ sudo !!
sudo apt update
Bash mostra la comanda expandida abans d’executar-la. Uns quants exemples més:
$ mkdir -p projectes/web
$ cd !$
cd projectes/web
$ cat informe.txt
$ ^cat^less
less informe.txt
Si vols veure què faria una expansió sense executar-la, afegeix :p al final (!513:p): la mostra i la posa a l’historial perquè la puguis editar amb la fletxa amunt.
Les comandes que fas servir més
$ history | awk '{print $2}' | sort | uniq -c | sort -nr | head -5
212 ls
147 cd
98 sudo
61 git
40 cat
awk agafa la segona columna (la comanda; la primera és el número), i sort | uniq -c | sort -nr les compta i les ordena de més a menys. Si tens activada la data a l’historial (vegeu més avall), la comanda serà en una altra columna.
Configurar l’historial
Totes aquestes variables es posen al fitxer ~/.bashrc. Debian, Ubuntu i Raspberry Pi OS ja en porten algunes de sèrie:
HISTCONTROL=ignoreboth
shopt -s histappend
HISTSIZE=1000
HISTFILESIZE=2000
| Variable | Què fa |
|---|---|
HISTSIZE | Quantes comandes es guarden a la memòria durant la sessió |
HISTFILESIZE | Quantes línies es guarden al fitxer ~/.bash_history |
HISTCONTROL | ignorespace: no desa les comandes que comencen amb un espai; ignoredups: no desa duplicats seguits; ignoreboth: totes dues coses; erasedups: esborra els duplicats anteriors |
HISTIGNORE | Llista de comandes (separades per :) que no es desen, per exemple "ls:cd:pwd:exit" |
HISTTIMEFORMAT | Afegeix la data i l’hora a cada entrada, per exemple "%F %T " |
shopt -s histappend | En tancar la sessió, afegeix les comandes al fitxer en lloc de sobreescriure’l |
Amb la data activada:
$ HISTTIMEFORMAT="%F %T "
$ history 2
520 2026-10-03 23:51:39 HISTTIMEFORMAT="%F %T "
521 2026-10-03 23:51:40 history 2
Si vols que l’historial es desi a mesura que treballes (i que no es perdi si el terminal es tanca malament), afegeix al ~/.bashrc:
PROMPT_COMMAND="history -a${PROMPT_COMMAND:+; $PROMPT_COMMAND}"
Que una comanda no quedi a l’historial
Si HISTCONTROL conté ignorespace o ignoreboth (com a Debian i Ubuntu), n’hi ha prou de començar la comanda amb un espai:
$ mysql -u root -pLaMevaContrasenya
Si no tens aquesta configuració, l’espai no fa res: comprova-ho amb echo $HISTCONTROL. De tota manera, el millor és no escriure mai contrasenyes a la línia de comandes: a més de l’historial, mentre la comanda s’executa són visibles per a altres usuaris a la llista de processos. Si se t’ha escapat alguna cosa:
history -d -2 # esborra la comanda anterior (la -1 és el mateix history -d)
history -d 514 # esborra l'entrada 514
history -c # esborra tot l'historial de la sessió...
history -w # ...i sobreescriu el fitxer amb l'historial buit
Compte: history no funciona dins dels scripts
Als scripts, Bash no carrega l’historial (només hi és a les sessions interactives), de manera que un script com aquest no fa res:
#!/bin/bash
history | grep compilar | tail -n 5 | bash # history és buit: no executa res
Si una seqüència de comandes es repeteix sovint, el que toca és posar-la en un script o en una funció del ~/.bashrc. Per reaprofitar comandes de l’historial, la comanda interna fc et permet editar-ne un rang amb el teu editor i executar-les en sortir:
fc 510 514