BashInformació del sistema LinuxLinuxShell Scripting

Les variables d’entorn a Linux: què són, com consultar-les i com definir-les



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

ComandaQuè mostra
echo $NOMEl valor d’una variable
printenv NOMEl valor d’una variable d’entorn (si no està exportada, no surt res)
env o printenvTotes les variables d’entorn
setTotes les variables del shell (d’entorn i no exportades) i les funcions
declare -p NOMCom 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

VariablePer a què serveix
PATHDirectoris on es busquen els executables, separats per :
HOMEDirectori personal de l’usuari
USER, LOGNAMENom de l’usuari
SHELLShell per defecte de l’usuari (el de /etc/passwd, no necessàriament el que fas servir ara)
PWDDirectori actual
LANG, LC_*Idioma i format regional (dates, números…)
TERMTipus de terminal (determina colors i tecles)
EDITOR, VISUALEditor que obren programes com crontab -e, git o visudo
PAGERPaginador per defecte (normalment less)
TZZona horària d’un procés concret (si no hi és, es fa servir la del sistema)
DISPLAYPantalla gràfica X11 on s’obren les aplicacions (:0)
WAYLAND_DISPLAYEl mateix per a sessions Wayland
LD_LIBRARY_PATHDirectoris addicionals on es busquen biblioteques compartides
TMPDIRDirectori per als fitxers temporals (si no hi és, /tmp)
XDG_CONFIG_HOMEOn es desen les configuracions de l’usuari (si no hi és, ~/.config)
MANPATHOn 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).

VariablePer a què serveix
PS1, PS2El prompt principal i el de continuació (>)
PS3El prompt de la instrucció select
PS4El prefix de les línies de traça amb set -x
UID, EUIDIdentificador numèric (real i efectiu) de l’usuari
GROUPSGrups de l’usuari (no existeix cap variable GID; per al grup, fes servir id -g)
PPIDPID del procés pare del shell
HOSTNAMENom de l’equip
OSTYPE, HOSTTYPE, MACHTYPESistema i arquitectura (linux-gnu, aarch64…)
HISTSIZE, HISTFILEMida i fitxer de l’historial
IFSCaràcters que separen les paraules (per defecte, espai, tabulador i salt de línia)
COLUMNS, LINESMida de la finestra del terminal
RANDOMUn 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:

FitxerQuan es llegeixPer a què
~/.bashrcCada terminal interactiu de BashPrompt, àlies, variables del teu usuari
~/.profile (o ~/.bash_profile)En iniciar sessióVariables d’entorn de l’usuari, com el PATH
/etc/profile.d/*.shEn iniciar sessió, per a tots els usuarisVariables globals
/etc/environmentEn 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üènciaEs mostra
\uUsuari
\hNom de l’equip (fins al primer punt)
\wDirectori actual (amb ~ per al teu directori personal)
\tHora (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.

Comandes relacionades