{{tag>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: - **NINL**: non interactive non login shell (utilisé par les processus et programmes) - **NIL**: non interactive login shell - **INL** interactive non login shell (le terminal émulé par l'interface graphique est donc de ce type) - **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)