Les cinc lliçons anteriors t'han donat l'arsenal d'ordres; aquesta t'ensenya a manejar-lo ràpid. Pot semblar un tema menor davant dels permisos o les canonades, però no ho és: en operacions, la diferència entre algú que teclegi cada ordre des de zero i algú que reutilitza, corregeix i encadena en segons es mesura en hores de feina a la setmana. Quan srv-veloz-01 està caigut a les tres de la matinada i necessites iterar sobre una cadena de filtres fins a trobar-ne la causa, aquesta velocitat deixa de ser comoditat i es converteix en capacitat real de resposta.

Contingut

  1. L'historial d'ordres i history
  2. Expansió de l'historial: !!, !$ i companyia
  3. Cerca incremental amb Ctrl-R
  4. Configurar l'historial: HISTSIZE, HISTCONTROL i companyia
  5. No deixis contrasenyes a l'historial
  6. Edició de línia amb readline
  7. Autocompleció amb Tab
  8. Control de treballs: primer contacte
  9. Àlies per al dia a dia de Veloz Envíos

  1. L'historial d'ordres i history

Bash desa cada ordre que executes en una llista numerada, que en tancar la sessió aboca a ~/.bash_history.

history | tail -3
  514  chmod 600 ~/veloz-ops/etc/veloz-ops.conf
  515  ls -l ~/veloz-ops/bin/
  516  history | tail -3

Aquests números són la clau per reutilitzar ordres. Operacions habituals sobre l'historial:

Ordre Efecte
history Llista tot l'historial numerat
history 20 Només les 20 últimes
history | grep chmod Buscar ordres anteriors que continguin chmod
history -d 514 Esborrar una entrada concreta (per exemple, una que duia una clau)
history -c Buidar l'historial de la sessió actual
history -a Abocar-lo ja al fitxer, sense esperar a tancar la sessió

Un detall que sorprèn: l'historial s'escriu en tancar la sessió, i si tens diverses terminals obertes, l'última a tancar-se pot sobreescriure el de les altres. La solució es veu a la secció 4.

  1. Expansió de l'historial: !!, !$ i companyia

Bash pot inserir trossos d'ordres anteriors a la línia actual mitjançant l'expansió de l'historial, que es dispara amb !.

Drecera Insereix
!! L'ordre anterior completa
!n L'ordre número n de l'historial
!-2 La penúltima ordre
!cad L'última ordre que començava per cad
!?cad? L'última ordre que contenia cad
!$ L'últim argument de l'ordre anterior
!^ El primer argument de l'ordre anterior
!* Tots els arguments de l'ordre anterior

L'ús estrella de !! és recuperar una ordre que ha fallat per manca de privilegis:

systemctl restart veloz-api    # → Failed to restart veloz-api.service: Access denied
sudo !!                        # s'expandeix a: sudo systemctl restart veloz-api

I !$ estalvia reescriure camins llargs, que és on més errors es cometen:

ls -l /srv/veloz/dades/historic/2026/08/enviaments-2026-08-03.csv
head -3 !$     # head -3 /srv/veloz/dades/historic/2026/08/enviaments-2026-08-03.csv

Existeix a més la substitució ràpida ^vell^nou, que repeteix l'ordre anterior canviant la primera aparició d'una cadena:

grep ERROR /var/log/veloz/app.log
^ERROR^WARN     # executa: grep WARN /var/log/veloz/app.log

És perfecta per corregir una errada sense reescriure la línia. Un consell de seguretat: amb ordres destructives, afegeix-hi el modificador :p (de print), que mostra l'ordre expandida en lloc d'executar-la i la deixa a l'historial a punt per recuperar-la amb la fletxa amunt. Així, !rm:p t'ensenya l'última ordre que començava per rm sense arribar a llançar-la.

  1. Cerca incremental amb Ctrl-R

L'expansió amb ! és potent, però requereix recordar. Ctrl-R no: obre una cerca incremental cap enrere que va mostrant la coincidència a mesura que escrius.

(reverse-i-search)`incid': grep ',incidencia,' /srv/veloz/dades/enviaments.csv | cut -d, -f3
Tecla Acció
Ctrl-R Iniciar la cerca, o saltar a la coincidència anterior
Ctrl-S Anar a la coincidència següent (cap endavant)
Enter Executar l'ordre trobada
Fletxa → o Ctrl-E Editar-la abans d'executar
Ctrl-G Cancel·lar i tornar a la línia buida

Aquesta és probablement la drecera que més vegades faràs servir en tota la teva vida professional: teclejar tres lletres d'una canonada que vas escriure fa dos dies i recuperar-la sencera.

Un advertiment clàssic amb Ctrl-S: en molts terminals aquesta combinació està capturada pel control de flux XON/XOFF i congela la pantalla en lloc de buscar. Si et passa, Ctrl-Q la descongela. Per alliberar Ctrl-S de manera permanent, afegeix stty -ixon al teu ~/.bashrc.

  1. Configurar l'historial: HISTSIZE, HISTCONTROL i companyia

El comportament de l'historial s'ajusta amb variables d'entorn que es defineixen a ~/.bashrc (lliçó 01-02):

Variable Què controla Valor recomanat
HISTSIZE Ordres desades en memòria durant la sessió 10000
HISTFILESIZE Ordres desades al fitxer ~/.bash_history 20000
HISTCONTROL Quines ordres no es desen ignoreboth
HISTIGNORE Patrons d'ordres a excloure "ls:cd:pwd:history:exit"
HISTTIMEFORMAT Marca de temps a cada entrada "%F %T "

HISTCONTROL admet tres valors combinables amb ::

  • ignoredups: no desa una ordre si és idèntica a l'anterior.
  • ignorespace: no desa les ordres que comencen per un espai.
  • ignoreboth: totes dues coses alhora. És l'opció habitual.

HISTTIMEFORMAT mereix atenció especial perquè canvia la sortida de history afegint-hi la data de cada ordre:

export HISTTIMEFORMAT="%F %T  "
history 2
  514  2026-08-03 11:22:41  chmod 600 ~/veloz-ops/etc/veloz-ops.conf
  515  2026-08-03 11:23:05  ls -l ~/veloz-ops/bin/

Saber quan vas executar alguna cosa és determinant a l'hora de reconstruir un incident: permet correlacionar les teves accions amb les marques de temps d'app.log.

I la configuració que resol el problema de les diverses terminals:

shopt -s histappend                        # afegir al fitxer en lloc de sobreescriure'l
PROMPT_COMMAND='history -a'                # abocar després de cada ordre, no en tancar

Amb aquestes dues línies al teu ~/.bashrc, cada terminal afegeix les seves ordres al fitxer comú immediatament i cap no trepitja les altres.

  1. No deixis contrasenyes a l'historial

Aquest apartat és curt i crític. Tot el que teclegis queda a ~/.bash_history, un fitxer de text pla. Si escrius mysql -u veloz -pLaMevaClauSecreta123, aquesta contrasenya queda desada al disc, se sincronitza a les còpies de seguretat i la veu qualsevol que accedeixi al teu compte. Tres defenses:

# 1. Anteposar un espai (requereix HISTCONTROL amb ignorespace)
 curl -H "Authorization: Bearer TOKEN123" https://api.veloz.local/envios

# 2. Esborrar l'entrada si ja l'has escrita
history -d 514 && history -a

# 3. Millor encara: que la credencial no sigui mai a la línia d'ordres
source ~/veloz-ops/etc/veloz-ops.conf   # el fitxer amb permisos 600 de la lliçó 02-03

Fixa't en l'espai inicial de la primera línia: és deliberat, i només funciona si HISTCONTROL inclou ignorespace. La tercera opció és la correcta a llarg termini, i és la raó per la qual a 02-03 vam protegir veloz-ops.conf amb permisos 600: els secrets viuen en un fitxer restringit, no a la línia d'ordres.

  1. Edició de línia amb readline

Bash fa servir la biblioteca readline per editar la línia actual, amb les mateixes dreceres que Emacs. Res de moure't caràcter a caràcter amb les fletxes:

Drecera Acció
Ctrl-A / Ctrl-E Anar al principi / final de la línia
Alt-B / Alt-F Retrocedir / avançar una paraula
Ctrl-U Esborrar des del cursor fins al principi
Ctrl-K Esborrar des del cursor fins al final
Ctrl-W Esborrar la paraula anterior
Alt-D Esborrar la paraula següent
Ctrl-Y Enganxar l'últim que s'ha esborrat amb U, K o W
Ctrl-_ Desfer l'últim canvi
Ctrl-L Netejar la pantalla sense perdre la línia que estaves escrivint
Ctrl-X Ctrl-E Obrir la línia actual al teu editor ($EDITOR)

Els tres que canvien la vida de debò:

  • Ctrl-W + Ctrl-Y funcionen com a tallar i enganxar: esborres un camí llarg, escrius una altra cosa i el recuperes on vulguis.
  • Ctrl-U és la manera correcta d'avortar una línia a mig escriure sense perdre l'indicador, i també serveix per no executar per error una ordre perillosa que ja has teclejat.
  • Ctrl-X Ctrl-E és la sortida d'emergència quan la canonada que estàs component ja no cap en una línia: s'obre a vim o nano, l'edites amb comoditat i en desar i sortir, Bash l'executa.

  1. Autocompleció amb Tab

Tab completa el que estàs escrivint. Si hi ha una única possibilitat, la completa sencera; si n'hi ha diverses, completa la part comuna i espera.

cd /srv/vel<Tab>              → cd /srv/veloz/
cat /var/log/veloz/ac<Tab>    → cat /var/log/veloz/acces.log

Doble Tab mostra totes les opcions possibles quan hi ha ambigüitat. En prémer Tab dues vegades sobre ls .../enviaments-2026-08-0, Bash llista les tres coincidències (enviaments-2026-08-01.csv, -02 i -03) i et deixa la línia intacta perquè continuïs escrivint.

La compleció no es limita als camins: al principi de la línia completa noms d'ordre (inclosos els de ~/veloz-ops/bin, gràcies al fet que és al PATH des de 01-02), i també completa variables ($HIST<Tab>) i usuaris (~jo<Tab>).

Instal·lant el paquet bash-completion el sistema aprèn a completar opcions i arguments de cada programa: git che<Tab> proposa checkout, systemctl restart vel<Tab> proposa els serveis que existeixen.

sudo apt install bash-completion    # a Ubuntu 24.04 sol venir ja instal·lat

Fes servir Tab sempre, fins i tot quan sàpigues escriure el camí: a més de ser més ràpid, és una verificació. Si Tab no completa, aquest camí no existeix, i acabes de detectar una errada abans d'executar un rm.

  1. Control de treballs: primer contacte

Quan una ordre triga massa o vols recuperar l'indicador sense matar-la, entra en joc el control de treballs:

Acció Efecte
Ctrl-C Interromp el procés en primer pla (li envia el senyal SIGINT)
Ctrl-Z Suspèn el procés i retorna l'indicador
jobs Llista els treballs de la sessió i el seu estat
fg %1 Porta el treball 1 a primer pla
bg %1 El reprèn en segon pla
ordre & Llança l'ordre directament en segon pla
tail -f /var/log/veloz/app.log
# prems Ctrl-Z  →  [1]+  Aturat    tail -f /var/log/veloz/app.log
bg %1     # continua vigilant el registre, però et retorna l'indicador
jobs      # [1]+  Executant    tail -f /var/log/veloz/app.log &
fg %1     # el recuperes per poder aturar-lo amb Ctrl-C

La distinció essencial és que Ctrl-C acaba el procés i Ctrl-Z només el pausa: un treball suspès continua existint i consumint memòria, i si tanques la terminal sense més pot quedar interromput a mitges. Els senyals, els processos orfes, nohup i la gestió seriosa de processos s'estudien a 05-02.

  1. Àlies per al dia a dia de Veloz Envíos

Un àlies és un nom curt per a una ordre llarga. Definits a ~/.bashrc, queden disponibles a cada sessió:

# --- Navegació, llistats i xarxa de seguretat (lliçó 02-01) ---
alias ll='ls -lh --color=auto'
alias la='ls -lha --color=auto'
alias ..='cd ..'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# --- Veloz Envíos ---
alias vlogs='cd /var/log/veloz'
alias vdades='cd /srv/veloz/dades'
alias vops='cd ~/veloz-ops'
alias applog='tail -f /var/log/veloz/app.log'
alias errors='grep -c ERROR /var/log/veloz/app.log'
alias ciutats='cut -d, -f3 /srv/veloz/dades/enviaments.csv | tail -n +2 | sort | uniq -c | sort -rn'

Després d'editar ~/.bashrc, recorda recarregar-lo amb source ~/.bashrc (01-02). Comprova què hi ha darrere d'un àlies amb type ciutats, i executa la versió original anteposant-hi una barra invertida: \rm fitxer ignora l'àlies rm -i.

Dos límits que convé conèixer des d'ara: els àlies no accepten arguments al mig (per a això hi ha les funcions, a 04-02) i no existeixen dins dels scripts, que és exactament el motiu pel qual el mòdul següent comença on comença. Un àlies és una drecera personal; un script és una eina que es pot compartir, versionar i programar.

Errors Habituals i Consells

  • Repetir a mà una ordre llarga. Si l'has escrita alguna vegada, és a l'historial: Ctrl-R i tres lletres.
  • Deixar credencials a ~/.bash_history. Fes servir l'espai inicial amb ignorespace, esborra l'entrada amb history -d i, millor encara, desa els secrets en un fitxer amb permisos 600.
  • Perdre l'historial en tancar diverses terminals. Afegeix-hi shopt -s histappend i PROMPT_COMMAND='history -a'.
  • Que Ctrl-S congeli la terminal. És el control de flux; Ctrl-Q l'allibera i stty -ixon el desactiva de manera permanent.
  • Fer servir !! sense mirar. Amb ordres destructives, verifica-ho primer amb !!:p.
  • Confondre Ctrl-C amb Ctrl-Z. El primer acaba, el segon suspèn; els treballs suspesos continuen allà.
  • Dependre d'àlies defensius com rm -i. No existeixen en scripts ni en altres màquines. Són una comoditat, no una política de seguretat.

Exercicis

Exercici 1 — Treballar sense reescriure. Partint d'ls -l /srv/veloz/dades/historic/2026/08/enviaments-2026-08-03.csv, aconsegueix amb el mínim de tecles: (a) veure les tres primeres línies d'aquest mateix fitxer; (b) repetir l'ls com a root; (c) repetir l'ls canviant 08 per 07 a la primera aparició.

Exercici 2 — Un historial professional. Escriu el bloc que afegiries a ~/.bashrc perquè l'historial desi 10000 ordres en memòria i 20000 al fitxer, no registri duplicats ni ordres que comencin per espai, ignori ls, cd, pwd i history, mostri data i hora, i no es perdi en treballar amb diverses terminals. Explica cada línia.

Exercici 3 — Diagnòstic veloç. veloz-api va lent i vols, a la mateixa terminal, vigilar el registre en directe i alhora consultar quantes incidències hi ha al CSV. Descriu la seqüència de tecles i ordres, i explica per què Ctrl-Z és preferible a Ctrl-C en aquest escenari.

Solucions

Solució a l'Exercici 1

head -3 !$      # (a) !$ insereix l'últim argument de l'ordre anterior
sudo !!         # (b) !! insereix l'ordre anterior completa
^08^07          # (c) repeteix l'anterior canviant la PRIMERA aparició de 08

Compte amb (c): ^08^07 substitueix només la primera coincidència. Al camí .../2026/08/enviaments-2026-08-03.csv la primera aparició de 08 és el directori, així que el resultat seria .../2026/07/enviaments-2026-08-03.csv, que probablement no existeix. Per canviar totes les aparicions cal el modificador global: !!:gs/08/07/. És un bon recordatori que les expansions de l'historial són literals i convé verificar-les amb :p abans d'executar res important.

Solució a l'Exercici 2

HISTSIZE=10000                          # ordres en memòria durant la sessió
HISTFILESIZE=20000                      # ordres conservades a ~/.bash_history
HISTCONTROL=ignoreboth                  # ignoredups + ignorespace
HISTIGNORE="ls:ll:cd:pwd:history:exit"  # soroll que no aporta res a l'historial
HISTTIMEFORMAT="%F %T  "                # data i hora a cada entrada de history
shopt -s histappend                     # afegir al fitxer, no sobreescriure'l
PROMPT_COMMAND='history -a'             # abocar després de cada ordre, no en tancar

ignoreboth és la peça doble: ignoredups evita que vint ls seguits omplin l'historial, i ignorespace habilita el truc de l'espai inicial per a ordres amb credencials. histappend i PROMPT_COMMAND van junts i resolen el problema clàssic de les sessions simultànies: sense ells, l'última terminal a tancar-se sobreescriu el fitxer amb el seu historial i esborra el de les altres.

Solució a l'Exercici 3

tail -f /var/log/veloz/app.log     # 1. vigilar el registre en directe
# Ctrl-Z                           → suspèn i retorna l'indicador
bg %1                              # 2. reprendre'l en segon pla
grep -c ',incidencia,' /srv/veloz/dades/enviaments.csv   # 3. consultar mentre continua
jobs                               # 4. comprovar l'estat del treball
fg %1                              # 5. recuperar-lo i aturar-lo amb Ctrl-C quan toqui

Per què Ctrl-Z i no Ctrl-C: Ctrl-C mataria el tail -f, i amb ell perdries la continuïtat de la vigilància; les línies escrites mentre no miraves no apareixerien en tornar-lo a llançar, perquè tail -f arrenca des del final actual del fitxer. Ctrl-Z seguit de bg manté el procés viu i seguint el registre sense interrupcions, mentre recuperes l'indicador per llançar la consulta. L'únic inconvenient és que en segon pla les seves línies es barregen amb la teva sessió; a la pràctica, per a vigilàncies llargues es prefereix una segona terminal o tmux, i per a processos que hagin de sobreviure al tancament de la sessió, nohup (05-02).

Conclusió

Amb aquesta lliçó tanques el Mòdul 2 i, amb ell, la teva competència a la línia d'ordres. Saps reutilitzar l'historial amb !!, !$ i ^vell^nou, i sobretot buscar-hi amb Ctrl-R, la drecera que més temps t'estalviarà en tota la teva carrera. Tens un historial configurat com el d'un professional: ampli, datat, sense soroll, sense duplicats, a resguard de les sessions simultànies i —el més important— sense credencials. Edites la línia amb readline en lloc de fer-ho amb les fletxes, aprofites l'autocompleció com a verificació a més de com a drecera, distingeixes suspendre d'acabar un procés, i tens àlies que converteixen les consultes més repetides sobre Veloz Envíos en una sola paraula.

Fes balanç del mòdul complet: crees i organitzes fitxers amb criteri; interrogues app.log, acces.log i enviaments.csv amb grep, cut, sort i uniq; entens i ajustes permisos; components filtres amb redireccions i canonades que ja escriuen informes a ~/veloz-ops/logs; selecciones fitxers amb comodins sense por; i et mous ràpid. Tot el que necessitaves de la terminal és aquí.

I precisament per això arriba el límit. Un àlies no accepta arguments, una canonada de cinc filtres no es pot documentar ni versionar, i res del que has escrit avui no s'executarà demà a les set del matí sense tu al davant. Al Mòdul 3 fem el salt: desaràs aquestes línies en un fitxer, aprendràs a executar-lo, a donar-li variables, condicions i arguments, i aquella cadena que avui teclejes cada matí es convertirà en la primera ordre de debò de ~/veloz-ops/bin. Comença el scripting.

Curs de Programació en Bash

Mòdul 1: Introducció a Bash

Mòdul 2: Ordres Bàsiques de Bash

Mòdul 3: Fonaments de Scripting

Mòdul 4: Scripting Intermedi

Mòdul 5: Tècniques Avançades de Scripting

Mòdul 6: Treballar amb Eines Externes

Mòdul 7: Automatització i Programació

Mòdul 8: Bones Pràctiques i Optimització

Mòdul 9: Projectes del Món Real

© Copyright 2026. Tots els drets reservats