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
- Què és un shell i què fa realment
- Bash dins de la família de shells Unix
- Breu història: de Thompson a Bourne Again
- Per què Bash continua sent l'estàndard de facto
- Els dos usos de Bash: intèrpret interactiu i llenguatge de scripting
- Comparativa: Bash davant d'altres shells
- On et trobaràs Bash a la vida professional
- El nostre cas pràctic: Veloz Envíos i el toolkit
veloz-ops - Les teves primeres ordres
- 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:
- Mostra un prompt (una invitació a escriure).
- Llegeix la línia que teclejes.
- La interpreta: decideix quina ordre vols executar i amb quines dades.
- Executa aquesta ordre i espera que acabi.
- 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.
- 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 descendeixenksh,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).
- 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.
- 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 desystemd, elscrontabi 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.
- 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.
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.
- 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ésdash, 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/bashdel 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.
- 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
RUNd'unDockerfileés una línia de shell, i elsentrypoint.shque preparen un contenidor abans d'arrencar l'aplicació són scripts de Bash. - Cloud: les
user-datad'una instància EC2, els scripts d'arrencada d'una VM d'Azure o GCP i bona part de la documentació d'aws/gcloud/azsó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
scriptsd'unpackage.json, elsMakefilei 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.
- El nostre cas pràctic: Veloz Envíos i el toolkit
veloz-ops
veloz-opsAl 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:
- Entra per SSH a
srv-veloz-01. - Mira si el disc té espai i si
veloz-apiés viva. - Cerca els
ERRORde les últimes 24 hores aapp.log. - Compta quantes peticions van retornar error 500 a
acces.log. - Obre
enviaments.csven un full de càlcul per comptar incidències per ciutat. - 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.
- 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 é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
Per defecte mostra la data en el format de l'idioma del sistema. Però accepta una opció de format que comença per +:
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
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
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/shen un script amb bashismes. A Ubuntu això invocadashi obtindràs errors del tipus[[: not found. Fes servir#!/usr/bin/env bashquan 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
mancada dia sense cap mena de complex.
Exercicis
Exercici 1: Identifica els conceptes
Sense executar encara res, respon amb les teves paraules:
- Quina diferència hi ha entre una terminal, un shell i el kernel?
- Per què un script escrit per a Bash pot fallar si l'executa
dash? - 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):
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è:
- Un script d'arrencada que ha de funcionar a Debian, a Alpine Linux i en un router amb BusyBox.
- El teu shell diari de treball, en què valores l'autocompletat intel·ligent.
- Un script que ha de córrer al pipeline de GitHub Actions de Veloz Envíos i que fa servir arrays.
- Automatitzar la creació de bústies de correu en un servidor Windows.
Solucions
Solució a l'Exercici 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.
- Perquè
dashimplementa 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,dashno les reconeix i falla. A Ubuntu i Debian,/bin/shés precisamentdash, així que l'error apareix tan bon punt es fa servir#!/bin/shper descuit. - Per exemple: els passos
run:d'un pipeline de CI/CD (GitHub Actions, GitLab CI); les instruccionsRUNi elsentrypoint.shde contenidors Docker; elsscriptsd'unpackage.jsono unMakefileen desenvolupament. També valdrien lesuser-datad'instàncies cloud o el preprocessament de datasets en ciència de dades.
Solució a l'Exercici 2
Desglossament del que passa:
- Bash detecta
$(date '+%Y-%m-%d')i l'executa primer. dateretorna2026-08-03.- Bash substitueix tota l'expressió per aquest text i en resulta una sola cadena.
echoimprimeix 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
shPOSIX (que a Alpine i BusyBox seràash, i a Debiandash). El requisit és la portabilitat màxima, així que cal renunciar als bashismes. És el cas que tractarem a 08-07.zshofish, per l'autocompletat i l'ergonomia superiors. Són decisions de comoditat personal; no afecten els scripts, que continuaran sent Bash.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.- 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
- 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
