Les variables d’entorn són parelles NOM=valor que cada procés de Linux rep del procés que l’ha creat. Els programes les consulten per saber coses com on és el teu directori personal, en quin idioma t’han de parlar, quin editor prefereixes o en quins directoris han de buscar els executables. Entendre-les t’ajuda a configurar el terminal al teu gust i a escriure scripts que s’adaptin a cada sistema.
Variables de shell i variables d’entorn
Al shell hi ha dos tipus de variables, i convé no confondre-les:
- Una variable de shell només existeix dins del shell on l’has creat.
- Una variable d’entorn és una variable que s’ha exportat amb
export: la reben tots els programes que s’executen des d’aquest shell (els processos fills).
$ PROVA=1
$ bash -c 'echo "fill: [$PROVA]"'
fill: []
$ export PROVA
$ bash -c 'echo "fill: [$PROVA]"'
fill: [1]
L’herència només va cap avall: un procés fill no pot canviar l’entorn del pare. Per això un script que fa export no canvia les variables del terminal des d’on l’has executat (si vols que ho faci, l’has d’executar amb source script.sh).
Consultar les variables
| Comanda | Què mostra |
|---|---|
echo $NOM | El valor d’una variable |
printenv NOM | El valor d’una variable d’entorn (si no està exportada, no surt res) |
env o printenv | Totes les variables d’entorn |
set | Totes les variables del shell (d’entorn i no exportades) i les funcions |
declare -p NOM | Com està definida una variable a Bash (si és exportada, de només lectura…) |
$ echo $HOME
/home/oscar
$ printenv LANG
en_GB.UTF-8
Variables d’entorn més habituals
| Variable | Per a què serveix |
|---|---|
PATH | Directoris on es busquen els executables, separats per : |
HOME | Directori personal de l’usuari |
USER, LOGNAME | Nom de l’usuari |
SHELL | Shell per defecte de l’usuari (el de /etc/passwd, no necessàriament el que fas servir ara) |
PWD | Directori actual |
LANG, LC_* | Idioma i format regional (dates, números…) |
TERM | Tipus de terminal (determina colors i tecles) |
EDITOR, VISUAL | Editor que obren programes com crontab -e, git o visudo |
PAGER | Paginador per defecte (normalment less) |
TZ | Zona horària d’un procés concret (si no hi és, es fa servir la del sistema) |
DISPLAY | Pantalla gràfica X11 on s’obren les aplicacions (:0) |
WAYLAND_DISPLAY | El mateix per a sessions Wayland |
LD_LIBRARY_PATH | Directoris addicionals on es busquen biblioteques compartides |
TMPDIR | Directori per als fitxers temporals (si no hi és, /tmp) |
XDG_CONFIG_HOME | On es desen les configuracions de l’usuari (si no hi és, ~/.config) |
MANPATH | On busca man les pàgines del manual |
Variables de Bash (no exportades)
Algunes variables molt conegudes no són d’entorn: les defineix Bash per a ús intern i els programes que executes no les reben (tret que les exportis tu).
| Variable | Per a què serveix |
|---|---|
PS1, PS2 | El prompt principal i el de continuació (>) |
PS3 | El prompt de la instrucció select |
PS4 | El prefix de les línies de traça amb set -x |
UID, EUID | Identificador numèric (real i efectiu) de l’usuari |
GROUPS | Grups de l’usuari (no existeix cap variable GID; per al grup, fes servir id -g) |
PPID | PID del procés pare del shell |
HOSTNAME | Nom de l’equip |
OSTYPE, HOSTTYPE, MACHTYPE | Sistema i arquitectura (linux-gnu, aarch64…) |
HISTSIZE, HISTFILE | Mida i fitxer de l’historial |
IFS | Caràcters que separen les paraules (per defecte, espai, tabulador i salt de línia) |
COLUMNS, LINES | Mida de la finestra del terminal |
RANDOM | Un número aleatori diferent cada vegada |
Crear i modificar variables
export EDITOR=nano # crear-la i exportar-la alhora
export PATH="$HOME/bin:$PATH" # afegir un directori al PATH, al davant
export PATH="$PATH:/opt/eina/bin" # o al final
unset PROVA # esborrar una variable
Al PATH, l’ordre importa: es busca primer als directoris de l’esquerra. No t’oblidis del $PATH de l’expressió: export PATH=/opt/eina/bin (sense $PATH) et deixaria sense poder executar ls, cp i companyia fins que tanquis el terminal.
Per passar una variable només a una comanda, sense canviar el teu entorn, posa-la al davant:
$ TZ=America/New_York date +"%H:%M %Z"
17:55 EDT
$ date +"%H:%M %Z"
23:55 CEST
Funciona amb qualsevol programa: LANG=C ls --help (missatges en anglès), EDITOR=vim crontab -e…
Fer que els canvis siguin permanents
Una variable creada al terminal desapareix quan el tanques. Per tenir-la sempre, posa-la en un d’aquests fitxers:
| Fitxer | Quan es llegeix | Per a què |
|---|---|---|
~/.bashrc | Cada terminal interactiu de Bash | Prompt, àlies, variables del teu usuari |
~/.profile (o ~/.bash_profile) | En iniciar sessió | Variables d’entorn de l’usuari, com el PATH |
/etc/profile.d/*.sh | En iniciar sessió, per a tots els usuaris | Variables globals |
/etc/environment | En iniciar sessió, per a tots els usuaris (el llegeix PAM, no el shell) | Només línies NOM=valor, sense export ni $VARIABLES |
Després d’editar el ~/.bashrc, aplica els canvis sense tancar el terminal:
source ~/.bashrc
Bon exemple: a Debian i Ubuntu, el ~/.profile que es crea per a cada usuari ja afegeix ~/bin i ~/.local/bin al PATH si aquests directoris existeixen. Si poses els teus scripts a ~/.local/bin, els podràs executar des de qualsevol lloc (en tornar a iniciar la sessió).
Tens més detalls sobre l’ordre en què es llegeixen aquests fitxers a la configuració de l’entorn i els fitxers d’inici de Bash.
Personalitzar el prompt
PS1 defineix el prompt. Algunes seqüències especials:
| Seqüència | Es mostra |
|---|---|
\u | Usuari |
\h | Nom de l’equip (fins al primer punt) |
\w | Directori actual (amb ~ per al teu directori personal) |
\t | Hora (HH:MM:SS) |
\$ | $, o # si ets root |
PS1='\u@\h:\w\$ ' # oscar@piiespai:~/projectes$
PS1='[\t] \w\$ ' # [23:55:02] ~/projectes$
Fes servir cometes simples perquè les seqüències no s’interpretin abans d’hora. PS1 no cal exportar-la; posa-la al ~/.bashrc.
Fer servir variables d’entorn en un script
Un script rep les variables d’entorn del procés que l’executa:
#!/bin/bash
if [ -z "$SALUTACIO" ]; then
echo "La variable SALUTACIO no està definida."
else
echo "$SALUTACIO"
fi
$ chmod +x salutacio.sh
$ ./salutacio.sh
La variable SALUTACIO no està definida.
$ SALUTACIO="Hola, Joan!" ./salutacio.sh
Hola, Joan!
$ export SALUTACIO="Bon dia!"
$ ./salutacio.sh
Bon dia!
Per donar un valor per defecte quan la variable no existeix, Bash té una sintaxi molt pràctica:
echo "${SALUTACIO:-Hola!}"
Compte amb les dades sensibles: les variables d’entorn d’un procés les pot llegir el mateix usuari (i root) a /proc/<pid>/environ, i s’hereten a tots els fills. Si hi poses contrasenyes o claus d’API, fes-ho amb cap i no les escriguis directament al terminal, on quedarien a l’historial.