Pourquoi avons-nous des shells de bash, pas de login, interactifs et non interactifs?

Ainsi, les pages man de bash expliquent ce que sont les connexions de connexion et interactives:

Un shell de connexion est celui dont le premier caractère de l'argument zéro est a -, ou on a commencé avec l'option –login.

Un shell interactif est démarré sans arguments sans option et sans l'option -c dont l'entrée et l'erreur standard sont toutes deux connectées aux terminaux (comme déterminé par isatty (3)), ou on a commencé avec l'option -i. PS1 est défini et $ – comprend i si bash est interactif, permettant à un script shell ou à un fichier de démarrage de tester cet état.

Je pense que cela signifie que nous pouvons avoir 4 types différents de coquilles:

  • Connecteurs de connexion interactifs,
  • Coquilles de connexion non interactives,
  • Coquilles interactives sans connexion,
  • Coquilles non-interactives sans connexion

Mais pourquoi avons-nous des coquilles interactives / non interactives et de connexion / non-connexion en premier lieu? Pourquoi la variété? Que perdririons-nous si nous n'avions qu'un type de coquille?

En essayant de déterminer si je suis dans un shell de connexion en exécutant echo $- , il produit:

 himBH 

Certains de ces drapeaux sont expliqués ici , mais h , H et m ne sont pas expliqués. Y at-il un endroit qui décrit tous ces drapeaux?

Ce sont mes pensées sur les différents "types" de coquillages – malheureusement, je n'ai pas assisté à la montée de l'Un * x dès le début (je suppose que ce concept est largement développé dans l'histoire), alors soyez critique.

  • Lorsque je me connecte à un système (aujourd'hui via la connexion graphique X), il peut y avoir des tâches qui devraient être exécutées une fois, par exemple établir une connexion à un type de serveur, me présenter une liste de tâches d'aujourd'hui, démarrer automatiquement certaines commandes, etc. N'aurais pas voulu chaque fois que j'ouvrirai un nouveau terminal. Il existe donc un ensemble de fichiers de configuration ( /etc/profile , ~/.bash_login et ainsi de suite, se référer au manuel pour une liste précise) provenant uniquement des shells de connexion .
  • En conséquence, pour fermer les connexions, tuer certains programmes, exécutez un script de sauvegarde, il existe ~/.bash_logout lorsque le shell de connexion existe.
  • Donc, le shell "normal" que j'utilise dans un terminal, ne doit pas être un shell de connexion , mais je devrais néanmoins lire mes préférences personnelles à partir de ~/.bashrc , car je veux que mes connexions de clés interagissent avec le shell – donc c'est un Coque interactif et sans connexion .
  • Et le dernier, mais pas le moindre lorsque bash est utilisé pour les scripts, aucun de ces éléments n'est important. bash devrait commencer aussi vite qu'il le peut, c'est-à-dire ne devrait pas lire de fichiers de configuration. Il s'agit d'un shell non interactif, sans connexion .

Donc, ma réponse à votre question Qu'aura-t-on perdre si nous n'avions qu'un type de coquille? Est en un mot: "Flexibilité".


La réponse à votre deuxième question est simple:

$- liste l'ensemble actuel d'options. Ceux-ci peuvent être définis par les paramètres de la ligne de commande à bash ou par l'intermédiaire de l' set . Il faut donc regarder deux endroits dans le manuel:

  • Section OPTIONS :

     -i If the -i option is present, the shell is interactive. 
  • SHELL BUILTIN COMMANDS section, sous- set :

     -h Remember the location of commands as they are looked up for execution. This is enabled by default. -m Monitor mode. Job control is enabled. This option is on by default for interactive shells on systems that sup‐ port it (see JOB CONTROL above). Background processes run in a separate process group and a line containing their exit status is printed upon their completion. -B The shell performs brace expansion (see Brace Expansion above). This is on by default. -H Enable ! style history substitution. This option is on by default when the shell is interactive.