Comandes LinuxInformació del sistema LinuxLinuxUtilidades linux

La comanda history a Linux: aprofita l’historial de Bash



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
nMostra només les n darreres comandes
-cEsborra tot l’historial de la sessió
-d posicióEsborra una entrada concreta (un número negatiu compta des del final)
-aAfegeix les comandes noves d’aquesta sessió al fitxer d’historial
-wEscriu tot l’historial de la sessió al fitxer (el sobreescriu)
-rLlegeix 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

DreceraQuè fa
Fletxa amunt / avallNavega per l’historial
Ctrl+RCerca 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
!513Executa la comanda número 513
!-2Executa la penúltima comanda
!tailExecuta la darrera comanda que comença per tail
!$L’últim argument de la comanda anterior
^vell^nouRepeteix 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
VariableQuè fa
HISTSIZEQuantes comandes es guarden a la memòria durant la sessió
HISTFILESIZEQuantes línies es guarden al fitxer ~/.bash_history
HISTCONTROLignorespace: no desa les comandes que comencen amb un espai; ignoredups: no desa duplicats seguits; ignoreboth: totes dues coses; erasedups: esborra els duplicats anteriors
HISTIGNORELlista de comandes (separades per :) que no es desen, per exemple "ls:cd:pwd:exit"
HISTTIMEFORMATAfegeix la data i l’hora a cada entrada, per exemple "%F %T "
shopt -s histappendEn 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

Comandes relacionades