A la lliçó anterior vas conèixer Veloz Envíos i el toolkit veloz-ops que construirem durant el curs. Abans d'escriure la primera línia d'aquest toolkit necessites un entorn de treball 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 ja creat. Aquesta és la lliçó que més gent es salta i la que més problemes evita: un entorn mal muntat produeix errors incomprensibles setmanes després («a la meva màquina funciona, al servidor no»). Deixem-ho ben lligat des del principi.

Contingut

  1. Comprovar si ja tens Bash i en quina versió
  2. Bash a Linux
  3. Bash a macOS: el problema de la versió 3.2
  4. Bash a Windows: WSL2 i Git Bash
  5. Obrir una terminal i triar emulador
  6. Els fitxers de configuració de Bash i quan es llegeix cadascun
  7. Personalització bàsica: PS1, àlies i PATH
  8. Crear l'esquelet del projecte ~/veloz-ops
  9. Recarregar la configuració amb source
  10. Triar editor: nano, vim, VS Code

  1. Comprovar si ja tens Bash i en quina versió

El primer, sempre, és esbrinar de què partim. Hi ha dues maneres complementàries de preguntar per la versió de Bash.

bash --version
GNU bash, versió 5.2.21(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2022 Free Software Foundation, Inc.
Llicència GPLv3+: GNU GPL versió 3 o posterior <http://gnu.org/licenses/gpl.html>

Aquesta ordre executa el programa bash que es trobi al teu PATH i li demana que s'identifiqui. És la versió que es faria servir en llançar un script nou.

echo "$BASH_VERSION"
5.2.21(1)-release

Aquí no executes cap programa: consultes una variable interna del shell que tens obert ara mateix. La diferència importa: si la teva terminal arrenca Zsh, bash --version et dirà quin Bash hi ha instal·lat, però $BASH_VERSION estarà buida perquè no ets dins de Bash.

1.1 Per què importa la versió

Versió Novetats rellevants On la trobes
3.2 (2007) Base POSIX + arrays indexats, [[ ]] macOS per defecte
4.0 (2009) Arrays associatius (declare -A), ** recursiu, &>> Distros antigues (CentOS 7)
4.2 (2011) declare -g, índexs negatius als arrays RHEL 7
4.4 (2016) ${var@Q} (citat segur), mapfile millorat, local -n Debian 9, Ubuntu 18.04
5.0 (2019) EPOCHSECONDS, EPOCHREALTIME, BASH_ARGV0 Ubuntu 20.04, RHEL 9
5.1–5.2 (2020-2022) ${var@k}, millores de rendiment, PROMPT_COMMAND com a array Ubuntu 22.04/24.04, Fedora

Per a aquest curs treballarem sobre Bash 5.x, que és el que porta srv-veloz-01 (Ubuntu 24.04 LTS). Els dos punts on la versió et mossegarà de debò són:

  • Arrays associatius (declare -A, els «diccionaris» de Bash). Els farem servir al Mòdul 4 per comptar enviaments per ciutat. No existeixen abans de Bash 4.
  • ${var@Q}, que retorna el valor d'una variable citat de manera segura per reutilitzar-lo. És molt útil en depuració i registre, i requereix Bash 4.4 o superior.

Si la teva versió és inferior a 4.4, continua llegint: la secció de macOS explica com actualitzar.

  1. Bash a Linux

És el cas més senzill: pràcticament totes les distribucions porten Bash instal·lat i com a shell per defecte de l'usuari. Si per algun motiu hi faltés:

# Debian, Ubuntu i derivades
sudo apt update && sudo apt install bash

# Fedora, RHEL, Rocky, AlmaLinux
sudo dnf install bash

# Arch Linux
sudo pacman -S bash

# Alpine Linux (contenidors)
apk add bash

Detall important per al cas d'Alpine: les imatges Docker basades en Alpine no porten Bash, només l'ash de BusyBox. Si un Dockerfile de Veloz Envíos fa servir RUN bash script.sh sobre Alpine sense instal·lar-lo, fallarà amb bash: not found. És un clàssic.

Per saber quin shell tens assignat com a shell d'inici de sessió:

echo "$SHELL"
/bin/bash

Compte amb una confusió freqüent: $SHELL no indica el shell que estàs executant ara, sinó el que tens configurat a /etc/passwd com a shell d'inici de sessió. Si obres Bash des de dins de Zsh, $SHELL continuarà dient /bin/zsh. La manera fiable de saber on ets la veurem a 01-04.

Per canviar el teu shell d'inici de sessió de manera permanent:

chsh -s /bin/bash

El canvi s'aplica a la sessió següent, no pas a l'actual.

  1. Bash a macOS: el problema de la versió 3.2

macOS inclou Bash, però congelat a la versió 3.2 del 2007. El motiu no és tècnic sinó de llicències: a partir de Bash 4, el projecte GNU va passar a la llicència GPLv3, que Apple no incorpora al seu sistema. A més, des de Catalina el shell per defecte dels comptes nous és Zsh.

Comprova la teva situació:

/bin/bash --version
GNU bash, version 3.2.57(1)-release (arm64-apple-darwin23)

Si penses seguir aquest curs des de macOS, instal·la un Bash modern amb Homebrew:

# 1. Instal·lar Homebrew si no el tens (consulta brew.sh)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 2. Instal·lar Bash modern
brew install bash

# 3. Comprovar on ha quedat instal·lat
brew --prefix bash
/opt/homebrew/opt/bash

Homebrew no reemplaça el /bin/bash del sistema (macOS el protegeix): n'instal·la un de nou a /opt/homebrew/bin/bash (Apple Silicon) o /usr/local/bin/bash (Intel). Perquè sigui el que es faci servir:

# Registrar el nou shell com a vàlid
echo "$(brew --prefix)/bin/bash" | sudo tee -a /etc/shells

# Establir-lo com a shell d'inici de sessió
chsh -s "$(brew --prefix)/bin/bash"
Ruta Versió Què és
/bin/bash 3.2 El d'Apple. No es pot tocar.
/opt/homebrew/bin/bash 5.x El modern, per a la teva feina diària
/bin/zsh 5.x Shell per defecte de macOS des de Catalina

Als teus scripts, fes servir sempre #!/usr/bin/env bash en lloc de #!/bin/bash: la primera forma cerca Bash al PATH i trobarà el modern, mentre que la segona apunta rígidament al 3.2 d'Apple.

  1. Bash a Windows: WSL2 i Git Bash

Windows no porta Bash, però hi ha dos camins amb propòsits ben diferents.

4.1 WSL2 (recomanat)

WSL2 (Windows Subsystem for Linux 2) executa un kernel Linux real dins de Windows. No és una emulació: és una màquina virtual lleugera perfectament integrada. És el més semblant a treballar a srv-veloz-01 que pots tenir en un portàtil Windows.

Des de PowerShell com a administrador:

wsl --install -d Ubuntu-24.04

Després de reiniciar i crear el teu usuari Linux, ja tens un Ubuntu complet amb Bash 5.2. Ordres útils des de PowerShell:

wsl --list --verbose      # veure distribucions instal·lades i el seu estat
wsl --set-default Ubuntu-24.04
wsl --shutdown            # reiniciar el subsistema si s'encalla

Dins de WSL, els teus discos de Windows apareixen sota /mnt/c, /mnt/d, etc.

ls /mnt/c/Users

Un consell de rendiment que estalvia molts disgustos: desa els teus projectes dins del sistema de fitxers de Linux (/home/el_teu_usuari/...), no pas a /mnt/c/.... L'accés entre sistemes de fitxers és lent i els permisos de Linux no es representen correctament a NTFS.

4.2 Git Bash

Git for Windows inclou Git Bash: un Bash compilat per a Windows amb un conjunt mínim d'utilitats Unix (ls, grep, sed, ssh). És còmode per fer servir Git i executar scripts senzills, però no és Linux: no hi ha systemd, no hi ha gestor de paquets, hi falten moltes eines i alguns comportaments difereixen.

Criteri WSL2 Git Bash
Kernel Linux real No
Gestor de paquets (apt) No
systemd, cron No
Instal·lació Cal activar la característica Instal·lador simple
Fidelitat amb srv-veloz-01 Alta Baixa
Recomanat per a aquest curs Només com a apedaçament

A partir del Mòdul 7 (cron, systemd) Git Bash directament no servirà. Si treballes a Windows, instal·la WSL2.

  1. Obrir una terminal i triar emulador

La manera d'obrir una terminal depèn del sistema:

Sistema Com obrir-la
Ubuntu/GNOME Ctrl + Alt + T, o cercar «Terminal»
KDE Cercar «Konsole»
macOS Cmd + Espai → «Terminal» o «iTerm»
Windows + WSL Obrir «Windows Terminal» i triar la pestanya Ubuntu

Emuladors habituals i per què triar-ne un o un altre:

  • GNOME Terminal / Konsole: els que porta el teu escriptori. Més que suficients per començar.
  • Windows Terminal: obligatori a Windows; gestiona pestanyes de PowerShell, CMD i WSL a la mateixa finestra, amb bon suport de colors i tipografies.
  • iTerm2 (macOS): divisió de plafons, cerca a l'historial, perfils. L'estàndard entre professionals de Mac.
  • Alacritty / WezTerm / Kitty: emuladors accelerats per GPU, molt ràpids amb sortides de registre enormes.
  • La terminal integrada de VS Code: còmoda perquè tens editor i shell a la mateixa finestra.

Recorda el que has vist a 01-01: l'emulador no és el shell. Canviar d'Alacritty a Kitty no canvia ni una coma del teu Bash.

  1. Els fitxers de configuració de Bash i quan es llegeix cadascun

Aquest és el punt on hi ha més confusió, i val la pena que l'entenguis de debò. Bash llegeix fitxers diferents segons com s'hagi arrencat, i hi ha dos eixos independents.

6.1 Els dos eixos: login i interactiu

  • Shell d'inici de sessió (login): és el primer que s'arrenca quan t'autentiques. Passa en entrar per SSH a srv-veloz-01, en iniciar sessió en una consola de text, o en executar bash --login.
  • Shell interactiu: té un prompt i espera que teclegis. Obrir una pestanya de terminal a l'escriptori arrenca un shell interactiu que no és de login.
  • Shell no interactiu: executa un script i acaba. No hi ha prompt ni ningú al davant. És el cas d'un script llançat per cron.

6.2 Taula de què es llegeix i quan

Situació Fitxers que llegeix Bash Exemple típic
Login interactiu /etc/profile, després el primer que existeixi de ~/.bash_profile, ~/.bash_login, ~/.profile Entrar per SSH a srv-veloz-01
No-login interactiu /etc/bash.bashrc i ~/.bashrc Obrir una pestanya de terminal
No interactiu (script) Cap dels anteriors; només el fitxer indicat a $BASH_ENV, si està definit Un script llançat per cron
Tancament de sessió de login ~/.bash_logout Sortir de la sessió SSH
graph TD
    A[Arrenca Bash] --> B{És shell de login?}
    B -->|Sí| C["/etc/profile → ~/.bash_profile<br/>(o ~/.bash_login, o ~/.profile)"]
    B -->|No| D{És interactiu?}
    D -->|Sí| E["/etc/bash.bashrc → ~/.bashrc"]
    D -->|No| F["Res, tret de $BASH_ENV"]
    C --> G[Prompt a punt]
    E --> G

6.3 La conseqüència pràctica

De la taula se'n dedueix el problema clàssic: si poses els teus àlies a ~/.bash_profile, no apareixeran en obrir una pestanya de terminal (que és no-login), i si els poses només a ~/.bashrc, no apareixeran en entrar per SSH (que és login). La solució universalment adoptada és que ~/.bash_profile carregui ~/.bashrc:

# ~/.bash_profile
# Si el shell és interactiu, carregar també la configuració de ~/.bashrc
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

Desglossament línia a línia:

  • if [ -f ~/.bashrc ]; then comprova si existeix un fitxer regular anomenat ~/.bashrc. L'opció -f significa «és un fitxer normal». Les condicionals s'estudien a fons a 03-04.
  • El punt solitari . és sinònim de source: executa el contingut d'aquest fitxer al shell actual, com si l'haguessis teclejat.
  • fi tanca l'if (és if escrit al revés, una convenció de Bash).

A Ubuntu, ~/.profile ja porta aquesta lògica de fàbrica. Si crees un ~/.bash_profile propi, tingues en compte que ~/.profile deixarà de llegir-se, perquè Bash només llegeix el primer que troba dels tres.

La regla d'or, i el que has de recordar:

Què vols configurar On posar-ho
Àlies, funcions, PS1, opcions interactives ~/.bashrc
Variables d'entorn (PATH, EDITOR) que hagin d'heretar els programes ~/.profile o ~/.bash_profile
Configuració comuna a tots els usuaris del servidor /etc/profile.d/*.sh

  1. Personalització bàsica: PS1, àlies i PATH

7.1 El prompt PS1

PS1 és la variable que defineix l'aspecte del prompt. Bash admet unes seqüències d'escapada pròpies:

Seqüència Significat
\u Nom d'usuari
\h Nom curt de la màquina
\w Directori actual complet (amb ~)
\W Només el nom del directori actual
\$ # si ets root, $ altrament
\t Hora en format HH:MM:SS
PS1='\u@\h:\w\$ '
joan@srv-veloz-01:~/veloz-ops$

Un prompt una mica més informatiu amb color, pensat per treballar en servidors:

PS1='\[\e[32m\]\u@\h\[\e[0m\]:\[\e[34m\]\w\[\e[0m\]\$ '

Aquí \e[32m activa el verd, \e[34m el blau i \e[0m restableix el color per defecte. Els delimitadors \\[ i \\] són imprescindibles: indiquen a Bash que allò que hi ha a dins no ocupa espai a la pantalla. Si els omets, el shell calcularà malament la longitud de la línia i veuràs el text trepitjant-se en fer servir l'historial.

Un consell professional molt útil: fes servir colors diferents al teu portàtil i al servidor de producció. Un prompt vermell a srv-veloz-01 és un recordatori visual constant d'on estàs teclejant, i evita el clàssic rm executat a la màquina equivocada.

7.2 Àlies

Un àlies és una drecera: una paraula que Bash substitueix per una altra cosa abans d'executar.

alias ll='ls -lh'
alias veloz-logs='cd /var/log/veloz'
alias ops='cd ~/veloz-ops'

Ara, escriure ll equival a escriure ls -lh. Aspectes que has de conèixer:

  • No deixis espais al voltant de l'=: alias ll = 'ls -lh' dona error.
  • Els àlies només funcionen en shells interactius. Un script no els veu; per això als scripts es fan servir funcions (Mòdul 4), no àlies.
  • alias sense arguments llista tots els definits.
  • Per saltar-te temporalment un àlies, anteposa-hi una barra invertida: \ls executa l'ls real.
alias
alias ll='ls -lh'
alias ops='cd ~/veloz-ops'
alias veloz-logs='cd /var/log/veloz'

7.3 La variable PATH

PATH és una llista de directoris, separats per dos punts, on Bash cerca els programes quan escrius un nom d'ordre.

echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Quan escrius date, Bash recorre aquests directoris d'esquerra a dreta i executa la primera coincidència. El mecanisme complet de cerca l'esmicolarem a la lliçó 01-04.

Per afegir-hi un directori propi:

export PATH="$HOME/veloz-ops/bin:$PATH"

Tres detalls que importen:

  • export fa que la variable l'heretin els programes que llancis des d'aquest shell. Sense export només existiria al shell actual.
  • Posar $HOME/veloz-ops/bin al davant significa que els teus scripts tenen prioritat. Posar-lo al darrere ($PATH:$HOME/veloz-ops/bin) és més conservador, perquè evita que un script teu anomenat ls faci ombra al del sistema.
  • No incloguis mai . (el directori actual) al PATH. És un risc de seguretat clàssic: n'hi hauria prou que algú deixés un fitxer anomenat ls en un directori compartit perquè l'executessis sense voler. Ho tractarem a 08-03.

  1. Crear l'esquelet del projecte ~/veloz-ops

Arriba el moment de crear l'estructura que ens acompanyarà tot el curs. Cada directori té un propòsit clar, imitant la convenció de qualsevol paquet Unix:

Directori Contingut Exemple futur
bin/ Scripts executables, els que s'invoquen pel seu nom veloz-informe, veloz-backup
lib/ Funcions reutilitzables que altres scripts carreguen amb source log.sh, csv.sh
etc/ Fitxers de configuració veloz-ops.conf
logs/ Sortida generada pels nostres propis scripts informe-2026-08-03.log

Crea'l amb una sola ordre:

mkdir -p ~/veloz-ops/{bin,lib,etc,logs}

Analitzem aquesta línia, perquè conté dues idees noves:

  • mkdir crea directoris. L'opció -p significa «crea també els directoris pare que calguin i no et queixis si ja existeixen». Sense -p, l'ordre fallaria si ~/veloz-ops encara no existís.
  • {bin,lib,etc,logs} és una expansió de claus: Bash la converteix en quatre rutes abans d'executar res. És a dir, mkdir rep realment quatre arguments. Aquesta expansió s'estudia a 02-05.

Comprova el resultat:

ls -R ~/veloz-ops
/home/joan/veloz-ops:
bin  etc  lib  logs

/home/joan/veloz-ops/bin:

/home/joan/veloz-ops/etc:

/home/joan/veloz-ops/lib:

/home/joan/veloz-ops/logs:

Ara afegeix bin/ al PATH de manera permanent. Obre ~/.bashrc amb el teu editor i afegeix-hi al final:

# --- Toolkit veloz-ops ---
export PATH="$HOME/veloz-ops/bin:$PATH"
alias ops='cd ~/veloz-ops'
alias veloz-logs='cd /var/log/veloz'

Observa que es fa servir $HOME i no pas ~. Dins de cometes dobles, la titlla no s'expandeix, de manera que "~/veloz-ops/bin" crearia una ruta literal invàlida. $HOME sí que funciona sempre. És un error molt habitual i difícil de detectar.

  1. Recarregar la configuració amb source

Has editat ~/.bashrc, però el teu shell obert no se n'assabenta tot sol: va llegir aquest fitxer en arrencar i no el torna a mirar. Tens dues opcions: tancar i obrir la terminal, o recarregar-lo.

source ~/.bashrc

O bé, de manera equivalent i més portable:

. ~/.bashrc

source executa el contingut del fitxer al shell actual, de manera que les variables i els àlies que defineix queden disponibles aquí i ara. Això és diferent d'executar el fitxer com un script: en aquest cas Bash arrencaria un procés fill, hi definiria les variables i les perdria en acabar. Aquesta diferència —fonamental i responsable d'innombrables hores perdudes— l'entendràs del tot a la lliçó 01-04, quan parlem de subshells.

Verifica que ha funcionat:

echo "$PATH" | tr ':' '\n' | head -3
/home/joan/veloz-ops/bin
/usr/local/sbin
/usr/local/bin

Aquesta ordre parteix el PATH pels dos punts i mostra les tres primeres entrades; tr i les canonades s'expliquen al Mòdul 2, aquí només ho fem servir per llegir-ho còmodament.

Un avís: si executes source ~/.bashrc diverses vegades, la línia export PATH="$HOME/veloz-ops/bin:$PATH" afegirà el directori repetidament. No és greu, però embruta. Una versió defensiva:

# Afegir només si encara no hi és
case ":$PATH:" in
    *":$HOME/veloz-ops/bin:"*) ;;
    *) export PATH="$HOME/veloz-ops/bin:$PATH" ;;
esac

La sentència case es veu a 04-05; guarda-te-la com a recepta de moment.

  1. Triar editor: nano, vim, VS Code

Escriuràs molts fitxers de text. Tria una eina i aprèn-la mínimament.

Editor Corba d'aprenentatge Quan fer-lo servir
nano Molt baixa Edicions ràpides en un servidor; hi és a tot arreu
vim Alta Quan treballes molt per SSH; potentíssim un cop dominat
VS Code Baixa Desenvolupament local, amb ressaltat, ShellCheck i depuració
micro Baixa Alternativa moderna a nano, amb dreceres d'escriptori

10.1 nano

nano ~/.bashrc

Les dreceres apareixen a la part inferior; ^ significa Ctrl. Les tres imprescindibles: Ctrl+O desa, Ctrl+X surt, Ctrl+W cerca.

10.2 vim

vim ~/.bashrc

Vim és modal, i aquí rau la seva dificultat inicial. La supervivència mínima:

  • Arrenques en mode normal (els caràcters són ordres, no text).
  • i entra en mode inserció per escriure.
  • Esc torna al mode normal.
  • :w desa, :q surt, :wq desa i surt, :q! surt descartant els canvis.

Encara que no l'adoptis, aprèn aquest mínim: en un servidor acabat d'instal·lar pot ser l'únic editor disponible.

10.3 VS Code amb WSL

Si treballes a Windows amb WSL2, instal·la l'extensió WSL de Microsoft. Llavors, des de la teva terminal d'Ubuntu:

code ~/veloz-ops

VS Code s'obrirà a Windows però treballant dins del sistema de fitxers de Linux, amb la seva terminal integrada apuntant a Bash. És la millor combinació de comoditat i fidelitat a l'entorn del servidor.

Extensions recomanades per a aquest curs:

  • ShellCheck: marca errors de shell mentre escrius (ho veurem a fons a 08-05).
  • shell-format: formata scripts automàticament.
  • Bash Debug: permet executar pas a pas.

Finalment, defineix el teu editor preferit perquè altres eines (com ara crontab -e, que farem servir al Mòdul 7) el respectin. A ~/.profile:

export EDITOR=nano
export VISUAL=nano

Errors Habituals i Consells

  • Posar els àlies a ~/.bash_profile. No apareixeran en obrir una pestanya de terminal, perquè aquella és una sessió no-login. Els àlies i el PS1 van a ~/.bashrc.
  • Crear un ~/.bash_profile i «perdre» la configuració de ~/.profile. Bash llegeix només el primer de ~/.bash_profile, ~/.bash_login, ~/.profile. Si crees el primer, el tercer deixa de llegir-se.
  • Escriure export PATH="~/veloz-ops/bin:$PATH". La titlla no s'expandeix dins de cometes dobles. Fes servir $HOME.
  • Oblidar $PATH en reassignar-lo. Escriure export PATH="$HOME/veloz-ops/bin" deixa el sistema sense accés a ls, grep ni res. Si et passa, la sessió actual queda inservible però s'arregla obrint una terminal nova i corregint el fitxer; per recuperar la sessió trencada pots fer servir export PATH=/usr/bin:/bin provisionalment.
  • Espais a alias ll = 'ls -lh'. A Bash, les assignacions no admeten espais al voltant de l'=.
  • Editar ~/.bashrc i esperar que el canvi s'apliqui tot sol. Recarrega amb source ~/.bashrc o obre una terminal nova.
  • Consell: abans de tocar ~/.bashrc, fes-ne una còpia (cp ~/.bashrc ~/.bashrc.bak). Un error de sintaxi allà pot deixar-te amb una terminal que mostra errors a cada arrencada.
  • Consell: si administres diversos servidors, mantén els teus dotfiles en un repositori Git. A 08-04 veurem com.

Exercicis

Exercici 1: Diagnòstic del teu entorn

Esbrina i anota, a la teva pròpia màquina:

  1. La versió de Bash instal·lada i si admet arrays associatius (necessites 4.0 o superior).
  2. El teu shell d'inici de sessió configurat.
  3. Quants directoris té el teu PATH.
  4. Si existeixen ~/.bashrc, ~/.bash_profile i ~/.profile.

Exercici 2: Muntar l'entorn de veloz-ops

Deixa el teu entorn a punt per al curs:

  1. Crea ~/veloz-ops amb els subdirectoris bin, lib, etc i logs en una sola ordre.
  2. Afegeix ~/veloz-ops/bin al principi del PATH de manera permanent.
  3. Defineix un àlies ops que et porti a ~/veloz-ops.
  4. Canvia el teu prompt perquè mostri usuari, màquina i directori actual.
  5. Aplica els canvis sense tancar la terminal i verifica que tot funciona.

Exercici 3: Raonar sobre els fitxers d'arrencada

Un company de Veloz Envíos defineix export API_TOKEN="abc123" únicament al seu ~/.bashrc. Després programa un script a cron que necessita aquesta variable, i l'script falla dient que API_TOKEN és buida.

  1. Explica per què falla.
  2. Proposa dues solucions diferents.

Solucions

Solució a l'Exercici 1

bash --version | head -1
echo "$BASH_VERSION"
echo "$SHELL"
echo "$PATH" | tr ':' '\n' | wc -l
ls -la ~/.bashrc ~/.bash_profile ~/.profile
GNU bash, versió 5.2.21(1)-release (x86_64-pc-linux-gnu)
5.2.21(1)-release
/bin/bash
6
-rw-r--r-- 1 joan joan 3771 ago  3 09:12 /home/joan/.bashrc
ls: no s'ha pogut accedir a '/home/joan/.bash_profile': El fitxer o directori no existeix
-rw-r--r-- 1 joan joan  807 ago  3 09:12 /home/joan/.profile

Interpretació: hi ha Bash 5.2, molt per damunt del 4.0 necessari per als arrays associatius; el shell d'inici de sessió és Bash; el PATH té 6 entrades (tr converteix els : en salts de línia i wc -l compta línies); i existeixen ~/.bashrc i ~/.profile, però no ~/.bash_profile, que és la configuració estàndard d'Ubuntu.

Solució a l'Exercici 2

# 1. Estructura de directoris
mkdir -p ~/veloz-ops/{bin,lib,etc,logs}

# 2, 3 i 4. Configuració persistent
cat >> ~/.bashrc << 'EOF'

# --- Toolkit veloz-ops ---
export PATH="$HOME/veloz-ops/bin:$PATH"
alias ops='cd ~/veloz-ops'
PS1='\u@\h:\w\$ '
EOF

# 5. Aplicar i verificar
source ~/.bashrc
echo "$PATH" | tr ':' '\n' | head -1
alias ops
ls ~/veloz-ops
/home/joan/veloz-ops/bin
alias ops='cd ~/veloz-ops'
bin  etc  lib  logs

La construcció cat >> fitxer << 'EOF' ... EOF és un here-document: afegeix al final del fitxer tot el text fins a la marca EOF. Les cometes simples al voltant de 'EOF' són importants: eviten que $HOME i $PATH s'expandeixin ara en lloc de quedar escrits literalment al .bashrc. Els here-documents s'estudien a 05-05; també pots fer-ho simplement obrint el fitxer amb nano ~/.bashrc i escrivint les línies a mà.

Solució a l'Exercici 3

  1. Falla perquè els scripts de cron s'executen en un shell no interactiu i sense login. Com hem vist a la taula, en aquest mode Bash no llegeix ni ~/.bashrc ni ~/.bash_profile. De fet, ~/.bashrc a Ubuntu comença amb una comprovació que avorta la seva execució si el shell no és interactiu. Per tant API_TOKEN no arriba mai a definir-se a l'entorn de cron.

  2. Dues solucions vàlides:

    • Definir la variable dins del mateix script o en un fitxer de configuració que l'script carregui explícitament, per exemple ~/veloz-ops/etc/veloz-ops.conf amb un source a l'inici. És la més neta i la que farem servir al curs: l'script no depèn de l'entorn de qui el llanci.
    • Definir-la al mateix crontab, ja que cron admet assignacions abans de les línies de tasques (API_TOKEN=abc123). Funciona, però barreja secrets amb la programació de tasques.

    Com a variant, es podria fer servir BASH_ENV apuntant a un fitxer d'entorn, però és poc habitual i fràgil. En general, la lliçó que cal extreure'n és: un script no ha de dependre de la configuració interactiva de l'usuari. Ho veurem aplicat a 07-01.

Conclusió

El teu entorn ja està a punt: saps quina versió de Bash tens i per què importa, com aconseguir un Bash modern a Linux, macOS i Windows, i —el més valuós a mitjà termini— quin fitxer de configuració es llegeix en cada situació, que és l'arrel de la majoria dels «a mi no em funciona». A més, ~/veloz-ops ja existeix amb els seus quatre directoris, el seu bin és al PATH i tens àlies i prompt al teu gust.

Amb el terreny preparat, toca aprendre a moure-t'hi. A la lliçó següent, Navegació Bàsica a la Línia d'Ordres, recorreràs l'arbre de directoris de Linux, entendràs l'anatomia d'una ordre i exploraràs per primer cop la infraestructura real de Veloz Envíos: /var/log/veloz, /srv/veloz/dades i el teu propi ~/veloz-ops.

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