Administration
Linux

Variables environnement Linux 2026 : .bashrc, .profile, PATH et configuration shell

31 janvier 2026

11 min de lecture

Les variables d'environnement contrôlent le comportement du shell et des applications. Ce guide explique comment configurer, gérer et optimiser les variables d'environnement sous Linux.

Comprendre Variables d'Environnement

Qu'est-ce qu'une Variable d'Environnement ?

Une variable d'environnement est une valeur nommée accessible par les processus du système.

Exemples courants :

  • PATH : Chemins recherche commandes
  • HOME : Répertoire utilisateur
  • USER : Nom utilisateur actuel
  • SHELL : Shell par défaut
  • LANG : Langue système

Analogie : Variables = post-its avec infos que tous programmes peuvent lire.

Variables Shell vs Environnement
# Variable shell (locale, pas héritée)
MY_VAR="value"

# Variable environnement (héritée par processus enfants)
export MY_VAR="value"

# Vérifier
echo $MY_VAR

# Lister toutes variables environnement
env
printenv

# Lister toutes variables (shell + env)
set

Variables Essentielles

PATH : Chemins Exécutables
# Voir PATH actuel
echo $PATH
# Output: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

# Ajouter répertoire temporairement
export PATH=$PATH:/opt/myapp/bin

# Ajouter au début (priorité haute)
export PATH=/opt/myapp/bin:$PATH

# Vérifier où commande trouvée
which python
# /usr/bin/python

# Voir tous chemins pour commande
whereis python
HOME : Répertoire Utilisateur
# Répertoire home
echo $HOME
# /home/username

# Raccourci tilde
cd ~
cd $HOME  # Équivalent

# Variables dérivées
echo $HOME/Documents
USER et Shell
# Utilisateur actuel
echo $USER
# username

# UID
echo $UID
# 1000

# Shell actuel
echo $SHELL
# /bin/bash

# Shell parent
echo $0
Langue et Localisation
# Langue système
echo $LANG
# en_US.UTF-8

# Voir toutes locales
locale

# Changer temporairement
export LANG=fr_FR.UTF-8

# Lister locales disponibles
locale -a

Fichiers Configuration Shell

Ordre Chargement Bash

Login shell (SSH, console) :

1. /etc/profile
2. ~/.bash_profile (si existe)
   OU ~/.bash_login (si existe)
   OU ~/.profile (si existe)
3. ~/.bash_logout (à la déconnexion)

Non-login shell (terminal dans GUI) :

1. /etc/bash.bashrc (Debian/Ubuntu)
   OU /etc/bashrc (RedHat)
2. ~/.bashrc
.bashrc vs .bash_profile

.bashrc : Interactif non-login

  • Terminal GUI
  • Nouveau tab terminal
  • Aliases, fonctions, prompts

.bash_profile : Login shell

  • SSH
  • Console login
  • Source .bashrc typiquement
Contenu Typique .bashrc
# ~/.bashrc

# Ne rien faire si non-interactif
[ -z "$PS1" ] && return

# Historique
HISTSIZE=10000
HISTFILESIZE=20000
HISTCONTROL=ignoredups:erasedups

# Prompt
PS1='\u@\h:\w\$ '

# Aliases
alias ll='ls -lah'
alias la='ls -A'
alias l='ls -CF'
alias grep='grep --color=auto'

# Ajouts PATH
export PATH=$PATH:$HOME/bin

# Complétion
if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

# Custom scripts
if [ -d ~/.bash_custom ]; then
    for file in ~/.bash_custom/*; do
        [ -r "$file" ] && source "$file"
    done
fi

Pour personnaliser davantage votre prompt, découvrez notre guide sur la personnalisation de votre prompt Bash.

Contenu Typique .bash_profile
# ~/.bash_profile

# Charger .profile si existe
if [ -f ~/.profile ]; then
    . ~/.profile
fi

# Charger .bashrc
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# Variables login seulement
export EDITOR=vim
export VISUAL=vim
.profile (POSIX compatible)
# ~/.profile
# Compatible tous shells POSIX (bash, sh, dash)

# PATH
export PATH=$HOME/bin:$PATH

# Variables
export EDITOR=vim
export PAGER=less

# Locale
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

# XDG directories
export XDG_CONFIG_HOME=$HOME/.config
export XDG_DATA_HOME=$HOME/.local/share

Définir Variables

Temporaire (session actuelle)
# Variable shell
MY_VAR="value"

# Variable environnement (héritée)
export MY_VAR="value"

# Ou en une ligne
MY_VAR="value" && export MY_VAR

# Vérifier
echo $MY_VAR
printenv MY_VAR
Permanent (tous shells futurs)

Pour utilisateur actuel :

# Éditer .bashrc
nano ~/.bashrc

# Ajouter
export MY_VAR="value"

# Recharger
source ~/.bashrc
# Ou
. ~/.bashrc

Pour tous utilisateurs :

# Éditer profile système
sudo nano /etc/environment

# Format (pas d'export)
MY_VAR="value"

# Ou dans /etc/profile.d/
sudo nano /etc/profile.d/custom.sh

export MY_VAR="value"

# Rendre exécutable
sudo chmod +x /etc/profile.d/custom.sh

Important : Les variables d'environnement affectent aussi les tâches cron. Découvrez comment gérer les variables dans crontab.


PATH : Gestion Avancée

Comprendre PATH
# PATH = liste chemins séparés par :
echo $PATH
# /usr/local/bin:/usr/bin:/bin

# Ordre = priorité
# Si 'python' existe dans /usr/local/bin ET /usr/bin
# → Exécute /usr/local/bin/python
Ajouter au PATH
# Méthode sûre (évite doublons)
if [[ ":$PATH:" != *":/opt/myapp/bin:"* ]]; then
    export PATH=$PATH:/opt/myapp/bin
fi

# Ajouter début (haute priorité)
export PATH=/opt/myapp/bin:$PATH

# Multiple chemins
export PATH=$PATH:/opt/app1/bin:/opt/app2/bin

# Avec variable
APP_BIN=/opt/myapp/bin
export PATH=$PATH:$APP_BIN
PATH pour Python Virtual Env
# Dans .bashrc
# Auto-activer virtualenv si présent
activate_venv() {
    if [ -f venv/bin/activate ]; then
        source venv/bin/activate
    fi
}

# Appeler à chaque cd
cd() {
    builtin cd "$@" && activate_venv
}
PATH Troubleshooting
# Commande introuvable ?
# 1. Vérifier existe
ls -l /path/to/command

# 2. Vérifier PATH
echo $PATH | tr ':' '\n'

# 3. Rechercher commande
which -a command
type -a command

# 4. Trouver où installée
find / -name command 2>/dev/null

# 5. Ajouter chemin si nécessaire
export PATH=$PATH:/chemin/trouvé

Variables Personnalisées

Variables Développement
# ~/.bashrc

# Node.js
export NODE_ENV=development
export NODE_OPTIONS="--max-old-space-size=4096"

# Python
export PYTHONPATH=$HOME/python-libs:$PYTHONPATH
export PYTHONDONTWRITEBYTECODE=1

# Go
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin

# Java
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin

# Rust
export PATH=$PATH:$HOME/.cargo/bin

# Docker
export DOCKER_HOST=unix:///var/run/docker.sock
Variables Applications
# Éditeur
export EDITOR=vim
export VISUAL=vim

# Browser
export BROWSER=firefox

# Pager
export PAGER=less
export LESS='-R -F -X'

# Terminal
export TERM=xterm-256color

# Proxy (si nécessaire)
export HTTP_PROXY=http://proxy.example.com:8080
export HTTPS_PROXY=http://proxy.example.com:8080
export NO_PROXY=localhost,127.0.0.1
Variables Build
# C/C++ Compilation
export CC=gcc
export CXX=g++
export CFLAGS="-O2 -march=native"
export CXXFLAGS="$CFLAGS"

# Make
export MAKEFLAGS="-j$(nproc)"

# CMake
export CMAKE_BUILD_TYPE=Release

Aliases et Fonctions

Aliases Utiles
# ~/.bashrc

# Navigation
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'

# Listings
alias ll='ls -lah'
alias la='ls -A'
alias l='ls -CF'
alias lt='ls -ltr'  # Tri par date

# Sécurité
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Git shortcuts
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gp='git push'
alias gl='git log --oneline --graph'

# Docker
alias dps='docker ps'
alias dpa='docker ps -a'
alias di='docker images'

# System
alias update='sudo apt update && sudo apt upgrade'
alias ports='netstat -tulanp'
alias meminfo='free -h'
alias diskinfo='df -h'

# Colorisation
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
alias ls='ls --color=auto'
Fonctions Shell
# ~/.bashrc

# Créer répertoire et cd dedans
mkcd() {
    mkdir -p "$1" && cd "$1"
}

# Extract archives
extract() {
    if [ -f "$1" ]; then
        case "$1" in
            *.tar.gz|*.tgz) tar xzf "$1" ;;
            *.tar.bz2|*.tbz2) tar xjf "$1" ;;
            *.tar.xz) tar xJf "$1" ;;
            *.zip) unzip "$1" ;;
            *.rar) unrar x "$1" ;;
            *.7z) 7z x "$1" ;;
            *) echo "Unknown archive type" ;;
        esac
    else
        echo "File not found: $1"
    fi
}

# Backup file
backup() {
    cp "$1" "$1.backup-$(date +%Y%m%d-%H%M%S)"
}

# Recherche fichier
ff() {
    find . -type f -name "*$1*"
}

# Recherche dans fichiers
search() {
    grep -r "$1" . --color=auto
}

# Process info
psgrep() {
    ps aux | grep -v grep | grep -i -e VSZ -e "$1"
}

# Tunnel SSH rapide
tunnel() {
    ssh -L "$1":localhost:"$1" "$2"
}

Prompt PS1 Personnalisé

Pour une personnalisation avancée de votre prompt Bash, consultez notre guide dédié.

Customiser Prompt
# ~/.bashrc

# Prompt simple
PS1='\u@\h:\w\$ '
# user@host:/path$

# Prompt coloré
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

# Avec Git branch
parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
PS1='\u@\h:\w\[\033[32m\]$(parse_git_branch)\[\033[00m\]\$ '

# Avec status dernière commande
PS1='[\u@\h:\w] $(if [ $? -eq 0 ]; then echo "\[\e[32m\]✓"; else echo "\[\e[31m\]✗"; fi)\[\e[0m\] \$ '

# Prompt multiligne
PS1='\n┌─[\[\033[01;32m\]\u@\h\[\033[00m\]]─[\[\033[01;34m\]\w\[\033[00m\]]\n└─\$ '
Prompt avec Starship (moderne)
# Installer starship
curl -sS https://starship.rs/install.sh | sh

# Activer dans .bashrc
eval "$(starship init bash)"

# Configuration
mkdir -p ~/.config
nano ~/.config/starship.toml

# Prompt minimal, rapide, avec Git/Docker/etc

Zsh : Shell Alternatif

Installer et Configurer Zsh
# Installer
sudo apt install zsh

# Définir comme shell par défaut
chsh -s $(which zsh)

# Installer Oh My Zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
Configuration .zshrc
# ~/.zshrc

# Oh My Zsh
export ZSH="$HOME/.oh-my-zsh"

# Theme
ZSH_THEME="robbyrussell"
# Ou: agnoster, powerlevel10k

# Plugins
plugins=(
    git
    docker
    kubectl
    sudo
    z
    zsh-autosuggestions
    zsh-syntax-highlighting
)

source $ZSH/oh-my-zsh.sh

# Custom aliases
alias ll='ls -lah'

# Custom PATH
export PATH=$HOME/bin:$PATH

Variables par Projet

.envrc avec direnv
# Installer direnv
sudo apt install direnv

# Activer dans .bashrc
eval "$(direnv hook bash)"

# Dans projet
cd ~/projet
nano .envrc

# Contenu .envrc
export DATABASE_URL=postgresql://localhost/mydb
export API_KEY=secret123
export DEBUG=true
PATH_add ./bin

# Autoriser
direnv allow

# Variables chargées auto en entrant dans dossier
# Déchargées en sortant
Variables Docker Compose
# .env dans projet
DATABASE_URL=postgresql://localhost/mydb
REDIS_URL=redis://localhost
NODE_ENV=development

# docker-compose.yml
services:
  app:
    env_file: .env
    environment:
      - PORT=3000

Sécurité Variables

Ne Jamais Hardcoder Secrets
# ❌ MAUVAIS
export API_KEY="secret123"

# ✓ BON - Fichier séparé
export API_KEY=$(cat ~/.secrets/api_key)

# ✓ BON - Variable système
# Définir au niveau système, pas dans .bashrc
Fichier Secrets Séparé
# ~/.secrets/env
export DATABASE_PASSWORD="securepassword"
export API_KEY="secret123"

# Permissions restrictives
chmod 600 ~/.secrets/env

# Dans .bashrc
if [ -f ~/.secrets/env ]; then
    source ~/.secrets/env
fi
Vérifier Variables Sensibles
# Voir toutes variables (attention, secrets visibles)
env

# Filtrer secrets communs
env | grep -i 'password\|secret\|key\|token'

# Ne jamais logger
echo $PASSWORD  # Visible dans history

# Mieux : lire depuis fichier
read -s PASSWORD < ~/.secrets/db_password

Debugging Configuration

Tracer Chargement
# Ajouter en haut de .bashrc
set -x  # Active trace

# Contenu .bashrc...

set +x  # Désactive trace

# Voir ordre exécution
bash --login -x
Vérifier Variables Chargées
# Toutes variables env
env | sort

# Seulement PATH
echo $PATH | tr ':' '\n'

# Rechercher variable
env | grep MY_VAR

# Voir d'où vient variable
grep -r "MY_VAR" ~/.bashrc ~/.bash_profile ~/.profile /etc/profile.d/
Problèmes Courants
# Variable non définie
# → Vérifier fichier chargé (.bashrc vs .bash_profile)
# → Source fichier : source ~/.bashrc

# PATH incorrect
# → echo $PATH | tr ':' '\n'
# → Vérifier ordre (priorités)

# Changements pas appliqués
# → Source : source ~/.bashrc
# → Ou nouveau shell : exec bash

# Conflits aliases
# → type command
# → which command

Exemples Configurations Complètes

.bashrc Développeur
# ~/.bashrc

# Historique
HISTSIZE=10000
HISTFILESIZE=20000
HISTCONTROL=ignoredups:erasedups
shopt -s histappend

# Prompt Git
parse_git_branch() {
    git branch 2>/dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[33m\]$(parse_git_branch)\[\033[00m\]\$ '

# Aliases
alias ll='ls -lah'
alias gs='git status'
alias dc='docker-compose'
alias k='kubectl'

# PATH
export PATH=$HOME/bin:$HOME/.local/bin:$PATH

# Dev tools
export EDITOR=vim
export NODE_ENV=development
export PYTHONDONTWRITEBYTECODE=1

# Fonctions
mkcd() { mkdir -p "$1" && cd "$1"; }
extract() {
    case "$1" in
        *.tar.gz) tar xzf "$1" ;;
        *.zip) unzip "$1" ;;
    esac
}
.bashrc Serveur Production
# ~/.bashrc

# Prompt sécurisé (pas de Git info)
PS1='[\u@\h:\w]\$ '

# Aliases sécurité
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Monitoring
alias meminfo='free -h'
alias diskinfo='df -h'
alias cpuinfo='top -bn1 | head -20'

# PATH minimal
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# Logs
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
export HISTSIZE=50000

Bonnes Pratiques

Organisation
# Structure recommandée
~/.bashrc              # Interactif
~/.bash_profile        # Login (source .bashrc)
~/.bash_aliases        # Aliases séparés
~/.bash_functions      # Fonctions séparées
~/.bash_custom/        # Scripts custom
~/.secrets/            # Variables sensibles
Performance
# Profiler chargement
time bash --login -c exit

# Optimiser :
# - Éviter commandes lentes dans .bashrc
# - Lazy load tools (nvm, rbenv)
# - Cache résultats si possible
Portabilité
# Code POSIX (compatible bash/zsh/sh)
if [ -f ~/.profile ]; then
    . ~/.profile
fi

# Bash-specific features
if [ -n "$BASH_VERSION" ]; then
    # Bash only code
fi

Conclusion

Les variables d'environnement sont au cœur de la configuration Linux :

Définir variables :

export MY_VAR="value"           # Temporaire
echo 'export MY_VAR="value"' >> ~/.bashrc  # Permanent
source ~/.bashrc                # Recharger

PATH :

export PATH=$PATH:/new/path
export PATH=/priority/path:$PATH

Fichiers :

~/.bashrc         # Interactif
~/.bash_profile   # Login
~/.profile        # POSIX
/etc/profile.d/   # Système

Debugging :

echo $VAR
env | grep VAR
source ~/.bashrc

Avec une configuration propre, votre environnement shell est optimisé, sécurisé et productif !

Besoin d'aide sur ce sujet ?

Notre équipe d'experts est là pour vous accompagner dans vos projets d'infrastructure et d'infogérance.

Contactez-nous

Articles similaires