Abans d'escriure ni una sola línia de codi convé entendre què és exactament aquella finestra negra plena de lletres on tants professionals de sistemes, desenvolupament i dades passen bona part de la jornada. Bash no és «la pantalla negra»: és un programa concret, amb la seva història, la seva sintaxi i el seu lloc ben definit dins del sistema operatiu. En aquesta lliçó descobriràs què és un shell, per què Bash va esdevenir l'estàndard de facto del món Unix i Linux, i quines són les seves dues cares: la d'intèrpret interactiu amb qui converses i la de llenguatge de programació amb què automatitzes. També coneixeràs Veloz Envíos, l'empresa fictícia que ens acompanyarà durant tot el curs i els problemes reals de la qual anirem resolent lliçó rere lliçó.

Contingut

  1. Què és un shell i què fa realment
  2. Bash dins de la família de shells Unix
  3. Breu història: de Thompson a Bourne Again
  4. Per què Bash continua sent l'estàndard de facto
  5. Els dos usos de Bash: intèrpret interactiu i llenguatge de scripting
  6. Comparativa: Bash davant d'altres shells
  7. On et trobaràs Bash a la vida professional
  8. El nostre cas pràctic: Veloz Envíos i el toolkit veloz-ops
  9. Les teves primeres ordres

  1. Què és un shell i què fa realment

Un shell (literalment, «closca» o «carcassa») és un programa que fa d'intermediari entre tu i el nucli del sistema operatiu. La seva feina es resumeix en un cicle molt simple que repeteix un cop i un altre:

  1. Mostra un prompt (una invitació a escriure).
  2. Llegeix la línia que teclejes.
  3. La interpreta: decideix quina ordre vols executar i amb quines dades.
  4. Executa aquesta ordre i espera que acabi.
  5. Mostra el resultat i torna al pas 1.

El nom «carcassa» és molt descriptiu: el shell embolcalla el kernel (el nucli de Linux, que gestiona memòria, processos, discos i xarxa) i t'ofereix una manera humana de demanar-li coses. Tu no parles amb el kernel directament; parles amb el shell, i el shell tradueix.

graph LR
    U[Usuari] -->|escriu ordres| S["Shell: Bash"]
    S -->|crides al sistema| K["Kernel de Linux"]
    K -->|gestiona| H["Maquinari: CPU, disc, xarxa"]
    K -->|resultat| S
    S -->|text a la pantalla| U

Convé separar tres conceptes que els principiants solen confondre:

Concepte Què és Exemple
Terminal La finestra o dispositiu on veus text i escrius GNOME Terminal, Windows Terminal, iTerm2
Shell El programa que interpreta el que escrius Bash, Zsh, Fish, dash
Kernel El nucli del sistema operatiu Linux, XNU (macOS)

És a dir: obres una terminal, que engega un shell (normalment Bash), que al seu torn demana serveis al kernel. Quan algú et diu «obre una terminal i executa aquesta ordre», en realitat et demana que la donis a Bash.

  1. Bash dins de la família de shells Unix

Bash vol dir Bourne Again SHell, un joc de paraules: és «el shell Bourne un altre cop» i alhora sona com born again, «renascut». Aquest nom delata el seu llinatge. A Unix hi ha dues grans famílies de shells:

  • Família Bourne (sh): el shell original d'Unix escrit per Stephen Bourne. D'aquí en descendeixen ksh, bash, dash, zsh. És la família amb la sintaxi que es va estandarditzar a POSIX i la que es fa servir per a scripting seriós.
  • Família C shell (csh, tcsh): sintaxi inspirada en el llenguatge C. Còmoda al seu moment per a l'ús interactiu, però desaconsellada per a scripts des de fa dècades.

Bash pertany a la primera família i és compatible cap enrere amb sh: gairebé qualsevol script escrit per al shell Bourne funciona a Bash sense canvis. Sobre aquesta base, Bash hi va afegir una enorme quantitat d'extensions pròpies que els professionals anomenen col·loquialment bashismes (arrays, [[ ... ]], expansió de claus, substitució de processos...). Aquestes extensions són potents, però convé saber que no són portables a qualsevol shell; hi tornarem a la lliçó de portabilitat POSIX (08-07).

  1. Breu història: de Thompson a Bourne Again

Una cronologia mínima ajuda a entendre per què les coses són com són:

Any Fita Rellevància
1971 Thompson shell (sh) a l'Unix original Introdueix la idea de shell com a programa reemplaçable
1977 Bourne shell de Stephen Bourne Hi afegeix variables, control de flux, scripts reals
1978 C shell de Bill Joy Historial i control de treballs per a l'ús interactiu
1983 KornShell (ksh) de David Korn Uneix el millor de tots dos; molt influent
1989 Bash 1.0, escrit per Brian Fox per a GNU Reemplaçament lliure del Bourne shell
1996 Bash 2.0, mantingut per Chet Ramey Consolidació de les extensions modernes
2004 Bash 3.0 La versió que encara avui porta macOS per llicència
2009 Bash 4.0 Arrays associatius, ** recursiu, coproc
2019 Bash 5.0 EPOCHSECONDS, millores de rendiment i de wait
2022+ Bash 5.2 i posteriors Correccions i afinament; base de les distros actuals

La dada clau: Bash va néixer com a programari lliure del projecte GNU. Quan Linux va aparèixer el 1991, va adoptar el conjunt d'eines GNU, i Bash hi va entrar per la porta gran com a shell per defecte de pràcticament totes les distribucions. Aquella decisió històrica és la raó que avui, trenta-cinc anys després, encara l'hagis d'aprendre.

  1. Per què Bash continua sent l'estàndard de facto

Hi ha shells més moderns i, en alguns aspectes, més agradables. Tot i així, Bash manté la seva posició per raons molt pràctiques:

  • Ubiqüitat: està instal·lat a gairebé qualsevol sistema Linux, a macOS, als contenidors més habituals i a les imatges dels núvols públics. Si escrius un script en Bash, és molt probable que funcioni a la màquina de destinació sense instal·lar res.
  • Estabilitat: un script escrit el 2005 encara funciona avui. En infraestructura, aquesta previsibilitat val or.
  • Efecte xarxa: la immensa majoria de la documentació, els tutorials, les respostes de fòrums i els exemples dels proveïdors cloud estan escrits en Bash.
  • És el pegament de l'ecosistema Unix: Bash no pretén fer-ho tot; la seva feina és encadenar programes especialitzats (grep, awk, sort, curl) per resoldre un problema. Aquest model de composició continua sent extraordinàriament productiu.
  • És a la ruta crítica de l'automatització: els Dockerfile, els pipelines de CI/CD, les unitats de systemd, els crontab i els instal·ladors acaben executant línies de shell.

Dit d'una altra manera: pots triar Zsh o Fish per a la teva comoditat diària, però tard o d'hora hauràs de llegir i escriure Bash perquè és la llengua franca dels servidors.

  1. Els dos usos de Bash: intèrpret interactiu i llenguatge de scripting

Aquesta distinció és fonamental i estructura tot el curs.

5.1 Bash com a intèrpret interactiu

És l'ús conversacional: escrius una ordre, prems Enter, veus el resultat, decideixes la següent. És exploració, diagnòstic, feina puntual.

whoami
joan

Aquí has fet una pregunta («qui soc?») i n'has obtingut una resposta immediata. En mode interactiu Bash et dona comoditats com ara l'historial, l'autocompletat amb el tabulador i un prompt personalitzable. Tot això ho veurem a les lliçons 01-02 i 02-06.

5.2 Bash com a llenguatge de scripting

És l'ús programàtic: deses una seqüència d'ordres en un fitxer de text i l'executes com un programa. Bash té llavors tot el que esperes d'un llenguatge: variables, condicionals, bucles, funcions, codis d'error.

#!/usr/bin/env bash
# Informe mínim del servidor de Veloz Envíos
echo "Servidor: $(hostname)"
echo "Data:     $(date '+%Y-%m-%d %H:%M')"
echo "Usuari:   $(whoami)"

Encara no et preocupis per la sintaxi: de moment no saps què fa #!/usr/bin/env bash ni per què hi ha un $( ). Tot això s'explica a partir del Mòdul 3. El que sí que has de retenir és la idea:

Aspecte Mode interactiu Mode script
Objectiu Explorar, diagnosticar, fer una cosa un sol cop Repetir de manera fiable i desatesa
Qui l'executa Una persona, en directe Cron, systemd, CI/CD, una altra persona
Tolerància a l'error Alta: el veus i el corregeixes Baixa: no hi ha ningú mirant
Prioritat Rapidesa en teclejar Llegibilitat i robustesa
Eines típiques Historial, àlies, autocompletat Funcions, control d'errors, registres

Un bon professional de Bash es mou contínuament entre tots dos mons: prova una idea de manera interactiva i, quan funciona, la cristal·litza en un script per no haver-la de tornar a fer a mà. Aquest és precisament el viatge que farem amb Veloz Envíos.

  1. Comparativa: Bash davant d'altres shells

Shell Origen Punt fort Debilitat Quan triar-lo
sh Bourne, 1977 (avui sol ser un enllaç a un altre shell) Portabilitat màxima, sintaxi mínima POSIX Sense arrays, sense [[ ]], molt espartà Scripts que han de funcionar a qualsevol Unix
bash GNU, 1989 Ubic, potent, documentadíssim Més lent que shells compilats en tasques intensives Scripts de sistema, CI/CD, ús general
dash Debian Almquist Shell Arrencada molt ràpida, lleuger Només POSIX: sense bashismes /bin/sh a Debian/Ubuntu, scripts d'arrencada
zsh 1990 Autocompletat i personalització superiors Diferències subtils amb Bash als scripts Shell interactiu diari; per defecte a macOS
fish 2005 Amigable, suggeriments i colors per defecte No és compatible amb POSIX: els scripts d'internet no funcionen Ús interactiu si valores l'ergonomia
PowerShell Microsoft, 2006 Treballa amb objectes, no amb text Ecosistema diferent, verbós, poc present a Linux Administració de Windows i Azure

Dos matisos importants que causen molts problemes a la pràctica:

  • A Ubuntu i Debian, /bin/sh és dash, no pas Bash. Si escrius un script amb bashismes i el comences amb #!/bin/sh, fallarà amb errors desconcertants. La regla: si fas servir funcionalitats de Bash, declara #!/usr/bin/env bash.
  • A macOS, el /bin/bash del sistema és la versió 3.2 del 2007 per motius de llicència (Apple no adopta la llicència GPLv3). Per això els arrays associatius, que van arribar amb Bash 4, no hi funcionen. Ho resoldrem a la lliçó 01-02.

  1. On et trobaràs Bash a la vida professional

No és un llenguatge que es faci servir «per gust»: apareix perquè és la via de menor resistència en aquests escenaris.

  • Servidors Linux: quan entres per SSH a una màquina, el que et rep és un shell. Diagnosticar per què un servei no arrenca o per què s'ha omplert el disc és feina de Bash.
  • CI/CD: GitHub Actions, GitLab CI i Jenkins executen els seus passos com a línies de shell. Un run: | de GitHub Actions és literalment Bash.
  • Contenidors Docker: cada RUN d'un Dockerfile és una línia de shell, i els entrypoint.sh que preparen un contenidor abans d'arrencar l'aplicació són scripts de Bash.
  • Cloud: les user-data d'una instància EC2, els scripts d'arrencada d'una VM d'Azure o GCP i bona part de la documentació d'aws/gcloud/az són Bash.
  • Ciència de dades i IA: preparar datasets, moure fitxers, llançar entrenaments per lots i encadenar eines se sol fer amb shell.
  • Desenvolupament diari: els scripts d'un package.json, els Makefile i els git hooks acaben invocant el shell.

En tots aquests contextos, saber Bash és la diferència entre «esperar que algú de sistemes m'ho miri» i resoldre-ho tu mateix en cinc minuts.

  1. El nostre cas pràctic: Veloz Envíos i el toolkit veloz-ops

Al llarg d'aquest curs no aprendràs Bash amb exemples abstractes, sinó resolent els problemes d'una empresa concreta.

Veloz Envíos és una companyia fictícia de repartiment d'última milla que opera a València, Sevilla i Bilbao. Tu hi entres com a responsable tècnic d'operacions. La teva infraestructura és aquesta:

Element Ruta / nom Contingut
Servidor principal srv-veloz-01 (Ubuntu 24.04 LTS) On corre l'API interna veloz-api
Registre d'accessos web /var/log/veloz/acces.log Format combinat: IP, data, petició, codi, bytes
Registre d'aplicació /var/log/veloz/app.log Línies 2026-08-03 10:15:22 [INFO] missatge
Dades de negoci /srv/veloz/dades/enviaments.csv id_enviament,data,ciutat,repartidor,estat,import
Els teus scripts ~/veloz-ops/ Amb bin/, lib/, etc/, logs/

El problema real que resoldrem és aquest. Cada matí, algú de l'equip fa a mà el següent:

  1. Entra per SSH a srv-veloz-01.
  2. Mira si el disc té espai i si veloz-api és viva.
  3. Cerca els ERROR de les últimes 24 hores a app.log.
  4. Compta quantes peticions van retornar error 500 a acces.log.
  5. Obre enviaments.csv en un full de càlcul per comptar incidències per ciutat.
  6. Ho copia tot en un correu i l'envia a operacions.

Són uns quaranta minuts diaris de feina repetitiva, propensa a errors i que ningú no fa quan aquesta persona és de vacances. És el candidat perfecte a l'automatització.

La solució que construirem, peça a peça, es diu veloz-ops: un petit toolkit de scripts propis que viu a ~/veloz-ops/ i que al final del curs serà capaç de generar aquest informe tot sol, cada matí, i avisar quan alguna cosa vagi malament. Cada mòdul hi aporta una peça:

graph TD
    M1["Mòdul 1-2<br/>Terreny: shell i ordres"] --> M3["Mòdul 3-4<br/>Primers scripts amb lògica"]
    M3 --> M5["Mòdul 5-6<br/>Robustesa, awk, sed, APIs"]
    M5 --> M7["Mòdul 7<br/>Cron, systemd, remot"]
    M7 --> M8["Mòdul 8<br/>Qualitat: ShellCheck, tests, Git"]
    M8 --> M9["Mòdul 9<br/>veloz-ops en producció"]

Guarda't aquesta imatge mental: tot el que aprenguis té una destinació concreta. No estem col·leccionant ordres, estem construint una eina.

  1. Les teves primeres ordres

Acabem tocant el teclat. Obre una terminal (si encara no saps com fer-ho, la lliçó 01-02 ho detalla) i prova aquestes tres ordres.

9.1 echo: escriure text a la pantalla

echo "Iniciant diagnostic de srv-veloz-01"
Iniciant diagnostic de srv-veloz-01

echo és l'ordre més simple de totes: imprimeix a la pantalla allò que li passes. Sembla trivial, però és la base dels missatges d'un script, dels informes i de la depuració. Fixa't en l'estructura: la paraula echo és l'ordre, i el text entre cometes és el seu argument. Les cometes agrupen diverses paraules en un únic argument; sense elles aquí també funcionaria, però adquireix l'hàbit des del principi (el perquè exacte s'explica a 03-06).

9.2 date: la data i l'hora del sistema

date
dl 03 ago 2026 10:15:22 CEST

Per defecte mostra la data en el format de l'idioma del sistema. Però accepta una opció de format que comença per +:

date '+%Y-%m-%d'
2026-08-03

Aquí %Y és l'any amb quatre dígits, %m el mes i %d el dia. Aquest format AAAA-MM-DD no és cap caprici: ordena alfabèticament igual que cronològicament, de manera que és el que farem servir per anomenar els fitxers de registre i els informes de veloz-ops. Un fitxer anomenat informe-2026-08-03.txt sempre queda al lloc correcte en llistar el directori.

9.3 whoami: amb quina identitat treballes

whoami
joan

Respon amb el nom de l'usuari actual. En un servidor compartit com srv-veloz-01 és una de les primeres coses que es comproven, perquè els permisos depenen de qui ets: no és el mateix ser joan que ser root. Els permisos es tracten en profunditat a la lliçó 02-03.

9.4 Combinant el que has après

echo "Diagnostic de srv-veloz-01 executat per $(whoami) el $(date '+%Y-%m-%d')"
Diagnostic de srv-veloz-01 executat per joan el 2026-08-03

Aquesta construcció $(ordre) s'anomena substitució d'ordres: Bash executa primer el que hi ha dins dels parèntesis i substitueix l'expressió per la seva sortida. És un dels mecanismes més útils del shell i l'estudiarem a fons a 03-06; de moment queda't amb la intuïció que et permet ficar el resultat d'una ordre dins d'un text.

Errors Habituals i Consells

  • Confondre la terminal amb el shell. Canviar d'emulador de terminal (de GNOME Terminal a Alacritty, per exemple) no canvia el teu shell. Si vols saber quin fas servir de debò, tens eines específiques que veurem a 01-02 i 01-04; no et refiïs de l'aspecte de la finestra.
  • Creure que «Linux» i «Bash» són sinònims. Bash és un programa que corre sobre Linux, i també pot córrer sobre macOS o Windows. A la inversa, un sistema Linux pot fer servir perfectament un altre shell.
  • Escriure #!/bin/sh en un script amb bashismes. A Ubuntu això invoca dash i obtindràs errors del tipus [[: not found. Fes servir #!/usr/bin/env bash quan usis funcionalitats de Bash.
  • Copiar ordres d'internet sense entendre-les. És la causa número u de desastres en servidors. A la lliçó 01-05 aprendràs a verificar què fa una ordre abans d'executar-la.
  • Pensar que Bash és «només per a administradors». Qualsevol perfil tècnic que treballi amb servidors, contenidors o pipelines el necessita. És una de les habilitats amb millor relació entre esforç d'aprenentatge i utilitat diària.
  • Consell de mètode: no memoritzis ordres. Memoritza conceptes (què és un shell, què és una expansió, què és un codi de sortida) i aprèn a consultar la documentació. Un professional consulta man cada dia sense cap mena de complex.

Exercicis

Exercici 1: Identifica els conceptes

Sense executar encara res, respon amb les teves paraules:

  1. Quina diferència hi ha entre una terminal, un shell i el kernel?
  2. Per què un script escrit per a Bash pot fallar si l'executa dash?
  3. Cita tres llocs del món professional on et trobaràs Bash encara que no siguis administrador de sistemes.

Exercici 2: El teu primer missatge d'operacions

Escriu a la terminal una única ordre que imprimeixi exactament aquest text (amb la data del dia en què l'executis):

[Veloz Envios] Informe diari generat el 2026-08-03

Pistes: necessites echo, la substitució $(...) i date amb el format +%Y-%m-%d.

Exercici 3: Triar el shell adequat

Per a cada situació, indica quin shell triaries i per què:

  1. Un script d'arrencada que ha de funcionar a Debian, a Alpine Linux i en un router amb BusyBox.
  2. El teu shell diari de treball, en què valores l'autocompletat intel·ligent.
  3. Un script que ha de córrer al pipeline de GitHub Actions de Veloz Envíos i que fa servir arrays.
  4. Automatitzar la creació de bústies de correu en un servidor Windows.

Solucions

Solució a l'Exercici 1

  1. La terminal és la finestra (o el dispositiu) que mostra text i recull les teves pulsacions; el shell és el programa que s'executa a dins i interpreta el que escrius; el kernel és el nucli del sistema operatiu, que gestiona maquinari, memòria i processos. La cadena és: tu → terminal → shell → kernel → maquinari.
  2. Perquè dash implementa només l'estàndard POSIX i no admet les extensions pròpies de Bash (arrays, [[ ... ]], expansió de claus...). Si l'script les fa servir, dash no les reconeix i falla. A Ubuntu i Debian, /bin/sh és precisament dash, així que l'error apareix tan bon punt es fa servir #!/bin/sh per descuit.
  3. Per exemple: els passos run: d'un pipeline de CI/CD (GitHub Actions, GitLab CI); les instruccions RUN i els entrypoint.sh de contenidors Docker; els scripts d'un package.json o un Makefile en desenvolupament. També valdrien les user-data d'instàncies cloud o el preprocessament de datasets en ciència de dades.

Solució a l'Exercici 2

echo "[Veloz Envios] Informe diari generat el $(date '+%Y-%m-%d')"
[Veloz Envios] Informe diari generat el 2026-08-03

Desglossament del que passa:

  1. Bash detecta $(date '+%Y-%m-%d') i l'executa primer.
  2. date retorna 2026-08-03.
  3. Bash substitueix tota l'expressió per aquest text i en resulta una sola cadena.
  4. echo imprimeix aquesta cadena resultant.

Les cometes dobles són necessàries aquí per dos motius: mantenen el text com un sol argument i, alhora, permeten que la substitució $(...) es dugui a terme. Si haguessis fet servir cometes simples, veuries literalment $(date '+%Y-%m-%d') a la pantalla. Aquesta diferència s'explica en detall a la lliçó 03-06.

Solució a l'Exercici 3

  1. sh POSIX (que a Alpine i BusyBox serà ash, i a Debian dash). El requisit és la portabilitat màxima, així que cal renunciar als bashismes. És el cas que tractarem a 08-07.
  2. zsh o fish, per l'autocompletat i l'ergonomia superiors. Són decisions de comoditat personal; no afecten els scripts, que continuaran sent Bash.
  3. bash, amb #!/usr/bin/env bash. Els arrays són una extensió de Bash i els runners de GitHub Actions el porten instal·lat per defecte.
  4. PowerShell, perquè l'ecosistema d'administració de Windows i Active Directory està construït damunt dels seus cmdlets i del seu model d'objectes.

Conclusió

Ja saps què és Bash i per què mereix el teu temps: és el shell que embolcalla el kernel, l'hereu directe del Bourne shell i l'estàndard de facto en servidors, contenidors i pipelines. N'has vist les dues cares —conversar amb el sistema en mode interactiu i automatitzar-lo en mode script—, com se situa davant de sh, dash, zsh, fish i PowerShell, i en quins moments de la teva vida professional apareixerà. I, sobretot, ja coneixes Veloz Envíos i el problema concret que resoldrem: aquells quaranta minuts diaris d'informe manual que acabaran convertits en el toolkit veloz-ops.

Per començar a treballar necessites un entorn en condicions: Bash instal·lat i en una versió moderna, una terminal còmoda, els teus fitxers de configuració sota control i l'esquelet de directoris del projecte creat. Això és exactament el que faràs a la lliçó següent, Configurant el teu Entorn.

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