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
- L'historial d'ordres i
history - Expansió de l'historial:
!!,!$i companyia - Cerca incremental amb
Ctrl-R - Configurar l'historial:
HISTSIZE,HISTCONTROLi companyia - No deixis contrasenyes a l'historial
- Edició de línia amb readline
- Autocompleció amb Tab
- Control de treballs: primer contacte
- Àlies per al dia a dia de Veloz Envíos
- L'historial d'ordres i
history
historyBash desa cada ordre que executes en una llista numerada, que en tancar la sessió aboca a ~/.bash_history.
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.
- Expansió de l'historial:
!!, !$ i companyia
!!, !$ i companyiaBash 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-apiI !$ 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.csvExisteix a més la substitució ràpida ^vell^nou, que repeteix l'ordre anterior canviant la primera aparició d'una cadena:
É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.
- Cerca incremental amb
Ctrl-R
Ctrl-RL'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.
| 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.
- Configurar l'historial:
HISTSIZE, HISTCONTROL i companyia
HISTSIZE, HISTCONTROL i companyiaEl 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:
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 tancarAmb aquestes dues línies al teu ~/.bashrc, cada terminal afegeix les seves ordres al fitxer comú immediatament i cap no trepitja les altres.
- 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-03Fixa'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.
- 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-Yfuncionen 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 avimonano, l'edites amb comoditat i en desar i sortir, Bash l'executa.
- 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.
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.
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.
- 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-CLa 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.
- À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-Ri tres lletres. - Deixar credencials a
~/.bash_history. Fes servir l'espai inicial ambignorespace, esborra l'entrada ambhistory -di, millor encara, desa els secrets en un fitxer amb permisos600. - Perdre l'historial en tancar diverses terminals. Afegeix-hi
shopt -s histappendiPROMPT_COMMAND='history -a'. - Que
Ctrl-Scongeli la terminal. És el control de flux;Ctrl-Ql'allibera istty -ixonel desactiva de manera permanent. - Fer servir
!!sense mirar. Amb ordres destructives, verifica-ho primer amb!!:p. - Confondre
Ctrl-CambCtrl-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 08Compte 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 tancarignoreboth é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 toquiPer 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
- Què és Bash?
- Configurar el teu Entorn
- Navegació Bàsica per la Línia d'Ordres
- Entendre el Shell
- Trobar Ajuda: man, help i --help
Mòdul 2: Ordres Bàsiques de Bash
- Operacions amb Fitxers i Directoris
- Ordres de Processament de Text
- Permisos i Propietat dels Fitxers
- Redirecció i Canonades
- Comodins i Expansió de Rutes
- Historial i Dreceres de Teclat
Mòdul 3: Fonaments de Scripting
- Crear i Executar un Script
- Variables i Constants
- Operadors Bàsics
- Sentències Condicionals
- Arguments i Entrada de l'Usuari
- Cometes, Expansió i Substitució
Mòdul 4: Scripting Intermedi
- Bucles en Bash
- Funcions en Bash
- Arrays i Arrays Associatius
- Manipulació de Cadenes
- La Sentència case i els Menús Interactius
- Aritmètica i Càlculs Numèrics
Mòdul 5: Tècniques Avançades de Scripting
- Operacions Avançades amb Fitxers
- Gestió de Processos
- Gestió d'Errors i Depuració
- Expressions Regulars
- Entrada/Sortida Avançada: Descriptors i Here-Documents
- Scripts Modulars i Llibreries Reutilitzables
Mòdul 6: Treballar amb Eines Externes
Mòdul 7: Automatització i Programació
- Tasques Cron
- Automatitzar Tasques
- Scripts de Còpia i Restauració
- Monitoratge i Registre
- Serveis i Temporitzadors amb systemd
- Automatització Remota amb SSH
Mòdul 8: Bones Pràctiques i Optimització
- Escriure Codi Llegible
- Optimitzar Scripts en Bash
- Consideracions de Seguretat
- Control de Versions amb Git
- Anàlisi Estàtica amb ShellCheck i shfmt
- Proves Automatitzades amb Bats
- Portabilitat: POSIX sh enfront de Bashismes
