Je comprends la différence fondamentale entre un shell interactif et un shell non interactif. Mais qu'est-ce qui différencie exactement un shell de connexion d'un shell sans connexion ?
Pouvez-vous donner des exemples d'utilisations d'un interactif sans connexion coquille ?
Réponse acceptée :
Un shell de connexion est le premier processus qui s'exécute sous votre ID utilisateur lorsque vous vous connectez pour une session interactive. Le processus de connexion indique au shell de se comporter comme un shell de connexion avec une convention :passer l'argument 0, qui est normalement le nom de l'exécutable du shell, avec un -
caractère ajouté (par exemple, -bash
alors que ce serait normalement bash
. Les shells de connexion lisent généralement un fichier qui fait des choses comme définir des variables d'environnement :/etc/profile
et ~/.profile
pour le shell Bourne traditionnel, ~/.bash_profile
en plus pour bash, /etc/zprofile
et ~/.zprofile
pour zsh, /etc/csh.login
et ~/.login
pour csh, etc.
Lorsque vous vous connectez sur une console texte, ou via SSH, ou avec su -
, vous obtenez une connexion interactive coquille. Lorsque vous vous connectez en mode graphique (sur un gestionnaire d'affichage X), vous n'obtenez pas de shell de connexion, mais plutôt un gestionnaire de session ou un gestionnaire de fenêtres.
Il est rare d'exécuter une connexion non interactive shell, mais certains paramètres X le font lorsque vous vous connectez avec un gestionnaire d'affichage, afin de s'arranger pour lire les fichiers de profil. Autres paramètres (cela dépend de la distribution et du gestionnaire d'affichage) lire /etc/profile
et ~/.profile
explicitement, ou ne les lisez pas. Une autre façon d'obtenir un shell de connexion non interactif consiste à se connecter à distance avec une commande transmise via une entrée standard qui n'est pas un terminal, par ex. ssh example.com <my-script-which-is-stored-locally
(par opposition à ssh example.com my-script-which-is-on-the-remote-machine
, qui exécute un shell non interactif et sans connexion).
Lorsque vous démarrez un shell dans un terminal dans une session existante (écran, terminal X, tampon de terminal Emacs, un shell dans un autre, etc.), vous obtenez un interactif, sans connexion coquille. Ce shell peut lire un fichier de configuration du shell (~/.bashrc
pour bash appelé en tant que bash
, /etc/zshrc
et ~/.zshrc
pour zsh, /etc/csh.cshrc
et ~/.cshrc
pour csh, le fichier indiqué par ENV
variable pour les shells compatibles POSIX/XSI tels que dash, ksh et bash lorsqu'elle est appelée en tant que sh
, $ENV
si défini et ~/.mkshrc
pour mksh, etc.).
Lorsqu'un shell exécute un script ou une commande transmise sur sa ligne de commande, il s'agit d'un non interactif, sans connexion coquille. De tels shells s'exécutent tout le temps :il est très courant que lorsqu'un programme appelle un autre programme, il exécute en réalité un petit script dans un shell pour invoquer cet autre programme. Certains shells lisent un fichier de démarrage dans ce cas (bash exécute le fichier indiqué par le BASH_ENV
variable, zsh exécute /etc/zshenv
et ~/.zshenv
), mais c'est risqué :le shell peut être invoqué dans toutes sortes de contextes, et il n'y a pratiquement rien que vous puissiez faire qui ne puisse pas casser quelque chose.
Je simplifie un peu, voir le manuel pour les détails sanglants.