Outils pour utilisateurs

Outils du site


sysadmin:linux:shell

Le shell

Le shell ou l'interpréteur de commandes est un programme spécialisé dont le rôle est de permettre les interactions avec le système d'exploitation. C'est une interface qui peut être utilisée soit par un opérateur humain soit par un programme. On distingues plusieurs modes de fonctionnement et d'invocation:

Modes de fonctionnement:

  • L' interactive shell (abrégé I) attend les instructions de l'utilisateur. Il est a l'écoute d'un périphérique d'entrée (le clavier) et traite séquentiellement les instructions communiquées par l'utilisateur.
  • Le non interactive shell (NI) est lancé par un processus automatisé, les commandes sont traitées par lots sans interaction attendue de la part de l'utilisateur.

Modes d'invocation:

  • Le login shell (L) est utilisé pour initialiser l'environnement de l'utilisateur. Il permet d’exécuter un ensemble de commandes seulement une fois, ces commandes sont regroupées dans des scripts d'initialisation lus seulement par le login shell.
  • Le non login shell (NL) désigne tout autre shell.

On retrouve au final 4 types de shell:

  1. NINL: non interactive non login shell (utilisé par les processus et programmes)
  2. NIL: non interactive login shell
  3. INL interactive non login shell (le terminal émulé par l'interface graphique est donc de ce type)
  4. IL interactive login shell

Identifier le shell de login

La documentation de bash indique que pour le shell de login, la variable réservée $0 préfixe le nom du script par le caractère -.

# Connexion SSH à un serveur distant pour démarrer un shell de login interactif (IL)
ssh user@host.example.com 
 
# Affiche la valeur de $0
echo $0
-bash
 
 
# invocation d'un nouveau shell et affichage de la variable $0
bash -i -s
echo $0
bash

Depuis un shell interactif, on peut utiliser la primitive exec pour remplacer le processus courant par un interpréteur nommé “-bash”:

# L'interpréteur courant est en mode interactif
# mais 'est pas un shell de login
echo $$
83679
 
shopt login_shell 
login_shell     off
 
# Ici on remplace l’exécution courante par un nouvel interpréteur bash nommé "-bash"
exec -a "-bash" bash
 
echo $0
-bash
 
# Le PID est identique
echo $$
83679
 
# mais l'option login_shell est bien active
shopt login_shell 
login_shell     on

Le fait d'avoir nommé explicitement le programme “-bash” a permis de positionner correctement la valeur de la variable login_shell.

Pour qu'un shell soit considéré comme shell de login, il suffit de positionner l'option -l lors de son l'invocation:

# Affiche le PID du shell courant
echo PID=$$
PID=5508
 
# Détermine si le shell courant est un shell de login:
shopt login_shell 
login_shell     off
 
# Invoque un nouveau shell avec l'option -l (login_shell)
# et exécute les commandes passées à l'option -c
/bin/bash -l -i -c 'echo $0; echo PID=$$; shopt login_shell; pstree -p -s -h $$'
/bin/bash
PID=37394
login_shell     on
systemd(1)───systemd(4262)───gnome-terminal-(4965)───bash(4973)───screen(5506)───screen(5507)───bash(5508)───bash(37394)───pstree(37401)
sysadmin/linux/shell.txt · Dernière modification : 2023/01/19 09:26 de yoann