Comprendre la configuration du shell bash au démarrage

Comprendre la configuration du shell bash au démarrage

Pendant des années, la coquille de bash [1] fait partie intégrante de nombreuses distributions Linux. Au début, Bash a été choisi comme coquille GNU officielle car il était bien connu, assez stable et a offert un ensemble décent de fonctionnalités.

Aujourd'hui, la situation est quelque peu différente - Bash est toujours présent partout comme un progiciel mais a été remplacé par des alternatives dans l'installation standard. Ceux-ci incluent, par exemple, Debian Almquist Shell (Dash) [2] (pour Debian GNU / Linux) ou Zsh [3] (pour GRML [5]). Dans les distributions bien connues Ubuntu, Fedora, Arch Linux et Linux Mint, Bash est resté jusqu'à présent la coque standard.

Il est très utile de comprendre le démarrage de bash et de savoir comment configurer cela correctement. Cela inclut la personnalisation de votre environnement de coquille, par exemple, la définition de la variable Path $, l'ajustement de l'apparence de l'invite de la coquille et la création d'alias. De plus, nous allons jeter un œil aux deux fichiers .bashrc et .Bash_Profile qui est lu au démarrage. Les connaissances correspondantes sont testées à l'examen 1 de la certification du Linux Professional Institute [4].

Comparaison d'une connexion interactive et d'une coque lot non interactive

En général, un shell a deux modes de fonctionnement. Il peut fonctionner comme un shell de connexion interactif et comme un coquille de lot non interactive. Le mode de fonctionnement définit le démarrage bash et quels fichiers de configuration sont lus [7]. Le mode de fonctionnement peut être différencié comme suit [6] - Shell de connexion interactif, coquille de connexion non enregistrée interactive, coque de connexion non interactive et coque non-interactive (lot).

Pour le dire simplement, un shell interactif lit et écrit au terminal d'un utilisateur. En revanche, un shell non interactif n'est pas associé à un terminal, comme lors de l'exécution d'un script de shell batt. Une coquille interactive peut être connectée ou une coque non logique.

Shell de connexion interactif

Ce mode fait référence à la connexion à votre ordinateur sur une machine locale à l'aide d'un terminal qui va de TTY1 à TTY4 (dépend de votre installation - il peut y avoir plus ou moins de terminaux). De plus, ce mode couvre à distance la connexion à un ordinateur, par exemple, via un shell sécurisé (SSH) comme suit:

$ SSH User @ Remote-System
$ ssh utilisateur @ télécommande à distance à distance

La première commande se connecte au système distant et ouvre uniquement un shell interactif. En revanche, la deuxième commande se connecte au système distant, exécute la commande donnée dans un shell de connexion non interactif et termine la connexion SSH. L'exemple ci-dessous le montre plus en détail:

$ ssh localhost de disponibilité
Mot de passe de l'utilisateur @ localhost:
11:58:49 en haut de 23 jours, 11:41, 6 utilisateurs, moyenne de chargement: 0,10, 0,14, 0,20
$

Afin de savoir si vous êtes connecté à votre ordinateur à l'aide d'un shell de connexion, saisissez la commande echo suivante dans votre terminal:

$ echo 0 $
-frapper
$

Pour un shell de connexion, la sortie commence par un «-» suivi du nom de la coquille, qui se traduit par «-bash» dans notre cas. Pour une coque non logique, la sortie n'est que le nom de la coque. L'exemple ci-dessous le montre pour les deux commandes écho à 0 $, et la disponibilité est donnée à SSH en tant que paramètre de chaîne:

$ ssh localhost "Echo 0 $; Up-temps"
Mot de passe de l'utilisateur @ localhost:
frapper
11:58:49 en haut de 23 jours, 11:41, 6 utilisateurs, moyenne de chargement: 0,10, 0,14, 0,20
$

Comme alternative, utilisez la commande de magasin intégrée [8] comme suit:

$ shopt login_shell
Login_shell
$

Pour un shell non-login, la commande renvoie «off», et pour un shell de connexion, «ON».

En ce qui concerne la configuration de ce type de shell, trois fichiers sont pris en compte. Ce sont / etc / profil, ~ /.profil, et ~ /.bash_profile. Voir ci-dessous pour une description détaillée de ces fichiers.

Coquille interactive non d'enregistrement

Ce mode décrit l'ouverture d'un nouveau terminal, par exemple, Terminal Xterm ou Gnome, et exécuter un shell dedans. Dans ce mode, les deux fichiers / etc / bashrc et ~ / /.Les bashrc sont lus. Voir ci-dessous pour une description détaillée de ces fichiers.

Shell non interactif

Ce mode est utilisé lors de l'exécution d'un script shell. Le script shell s'exécute dans sa propre sous-coquille. Il est classé comme non interactif à moins qu'il ne demande la saisie de l'utilisateur. Le shell s'ouvre uniquement pour exécuter le script et le ferme immédiatement une fois le script terminé.

./ Script local.shot

Shell de connexion non interactif

Ce mode couvre la connexion à un ordinateur à partir d'une télécommande, par exemple, via Secure Shell (SSH). Le script shell local-script.SH est exécuté localement, d'abord, et sa sortie est utilisée comme entrée de SSH.

./ Script local.sh | User SSH @ Système à distance

Le démarrage de SSH sans autre commande commence un shell de connexion sur le système distant. Dans le cas où le périphérique d'entrée (STDIN) du SSH n'est pas terminal, SSH démarre un shell non interactif et interprète la sortie du script en tant que commandes à exécuter sur le système distant. L'exemple ci-dessous exécute la commande Uptime sur le système distant:

$ echo "Uptime" | ssh localhost
Pseudo-terminal ne sera pas alloué car le stdin n'est pas un terminal.
Mot de passe de Frank @ LocalHost:
Les programmes inclus avec le système Debian GNU / Linux sont un logiciel gratuit;
Les termes de distribution exacts pour chaque programme sont décrits dans le
Fichiers individuels dans / usr / share / doc / * / copyright.
Debian GNU / Linux ne vient avec absolument aucune garantie, dans la mesure
autorisé par la loi applicable.
Vous avez un nouveau courrier.
11:58:49 en haut de 23 jours, 11:41, 6 utilisateurs, moyenne de chargement: 0,10, 0,14, 0,20
$

Fait intéressant, SSH se plaint que STDIN ne soit pas un terminal et affiche le message du jour (MOTD) qui est stocké dans le fichier de configuration global / etc / MOTD. Afin de raccourcir la sortie du terminal, ajoutez l'option «SH» comme paramètre de la commande ssh, comme indiqué ci-dessous. Le résultat est qu'un shell est ouvert en premier, et les deux commandes sont exécutées sans afficher le MOTD, d'abord.

$ echo "Uptime" | ssh localhost sh
Mot de passe de Frank @ LocalHost:
12:03:39 en hausse de 23 jours, 11:46, 6 utilisateurs, moyenne de chargement: 0,07, 0,09, 0,16
$$

Ensuite, nous allons jeter un œil aux différents fichiers de configuration pour bash.

Fichiers de démarrage

Les différents modes bash définissent quels fichiers de configuration sont lus au démarrage:

  • Shell de connexion interactif
    • / etc / profil: s'il existe, il exécute les commandes répertoriées dans le fichier.
    • ~ /.bash_profile, ~ /.bash_login, et ~ /.profil (dans cet ordre). Il exécute les commandes du premier fichier lisible trouvé dans la liste. Chaque utilisateur individuel peut avoir son propre ensemble de ces fichiers.
  • coquille interactive non d'enregistrement
    • / etc / bash.Bashrc: Configuration globale de bash. Il exécute les commandes si ce fichier existe, et il est lisible. Disponible uniquement dans Debian GNU / Linux, Ubuntu et Arch Linux.
    • ~ /.Bashrc: configuration de bash locale. Il exécute les commandes si ce fichier existe, et il est lisible.

Il peut être utile de voir cela comme un graphique. Au cours de la recherche, nous avons trouvé l'image ci-dessous, que nous aimons beaucoup [9].


image: config-path.PNG
texte: Processus d'évaluation pour la configuration de bash

Les différents fichiers de configuration expliqués

Pour les fichiers expliqués ci-dessous, il n'y a pas de règlement général sur quelle option de stockage dans quel fichier (sauf pour les options globales vs. Options locales). En outre, l'ordre des fichiers de configuration est lecture est conçu avec une flexibilité à l'esprit afin qu'un changement de shell que vous utilisez garantit que vous pouvez toujours utiliser votre système Linux. C'est pourquoi plusieurs fichiers sont utilisés qui configurent la même chose.

/ etc / profil

Ce fichier est utilisé par le Bourne Shell (SH) ainsi que par des obus compatibles Bourne comme Bash, Ash et Ksh. Il contient les entrées par défaut pour les variables d'environnement pour tous les utilisateurs qui se connectent de manière interactive. Par exemple, cela influence le chemin $ et la conception rapide pour les utilisateurs réguliers ainsi que l'utilisateur nommé «Root». L'exemple ci-dessous montre une partie de / etc / profil de Debian GNU / Linux.

SetUserPath ()
# Répertoires communs aux exécutables pour tous les utilisateurs
Path = "/ usr / local / bin: / usr / bin: / bin"
# Test pour l'utilisateur racine à ajouter pour les programmes d'administration système
si ["'id -u'" -eq 0]; alors
Path = "/ usr / local / sbin: / usr / sbin: / sbin: $ path"
autre
Path = "/ usr / local / jeux: / usr / jeux: $ path"
Fi
chemin d'exportation

SetUserPath ()
# PS1 est la chaîne d'invite de commande principale
si ["$ ps1"]; alors
Si ["$ bash"] && ["$ bash" != "/ bin / sh"]; alors
# Le fichier bash.Bashrc définit déjà la PS1 par défaut.
# Ps1 = "\ h: \ w \ $"
Si [-f / etc / bash.Bashrc]; alors
. / etc / bash.bashrc
Fi
autre
si ["'id -u'" -eq 0]; alors
Ps1 = '#'
autre
Ps1 = '$'
Fi
Fi
Fi

D'autres fichiers de configuration peuvent être enregistrés dans le répertoire / etc / profil.d. Ils proviennent de la configuration de bash dès que / etc / le profil est lu.

~ /.bash_profile

Ce fichier de configuration local est lu et exécuté lorsque Bash est invoqué comme un shell de connexion interactif. Il contient des commandes qui ne devraient fonctionner qu'une seule fois, comme la personnalisation de la variable d'environnement $ Path.

Il est assez courant de remplir ~ /.bash_profile juste avec des lignes comme ci-dessous .fichier bashrc. Cela signifie que chaque fois que vous vous connectez au terminal, le contenu de votre configuration de bash locale est lu.

Si [-f ~ /.Bashrc]; alors
. ~ /.bashrc
Fi

Si le fichier ~ /.Bash_Profile existe, puis Bash sautera la lecture de ~ /.bash_login (ou ~ /.profil).

~ /.bash_login

Les deux fichiers ~ /.bash_profile et ~ /.bash_login sont analogues.

~ /.profil

La plupart des distributions Linux utilisent ce fichier au lieu de ~ /.bash_profile. Il est utilisé pour localiser le fichier local .bashrc et pour étendre la variable de chemin $.

# Si courir bash
si [-n "$ bash_version"]; alors
# inclure .bashrc si ça existe
Si [-f "$ home /.Bashrc "]; alors
. "$ Home /.bashrc "
Fi
Fi
# Set Path pour qu'il inclut le bac privé de l'utilisateur s'il existe
si [-d "$ home / bin"]; alors
Path = "$ home / bin: $ path"
Fi

En général, ~ /.Le profil est lu par tous les coquilles. Si soit ~ /.bash_profile ou ~ /.Bash_login existe, Bash ne lira pas ce fichier.

/ etc / bash.Bashrc et ~ /.bashrc

Ce fichier contient la configuration de bash et gère les alias locaux, limites d'historique stockées dans .Bash_History (voir ci-dessous) et l'achèvement de bash.

# Ne mettez pas de lignes ou de lignes en double commençant par l'espace dans l'histoire.
# Voir bash (1) pour plus d'options
HistControl = Ignoreboth
# Ajouter au fichier d'historique, ne le remplacez pas
shopt -s histappend
# Pour définir la longueur de l'historique, voir Histsize et Histfilesize in bash (1)
Histsize = 1000
Histfilesize = 2000

Quoi configurer dans quel fichier

Comme vous l'avez appris jusqu'à présent, il n'y a pas un seul fichier mais un groupe de fichiers pour configurer Bash. Ces fichiers existent juste pour des raisons historiques - en particulier la façon dont les différents coquilles ont évolué et emprunté des fonctionnalités utiles les unes des autres. De plus, il n'y a pas de règles strictes connues que

Définissez quel fichier est destiné à conserver un certain morceau de la configuration. Ce sont les recommandations que nous avons pour vous (sur la base de TLDP [10]):

  • Tous les paramètres que vous souhaitez appliquer à tous les environnements de vos utilisateurs doivent être dans / etc / profil.
  • Tous les alias et fonctions globaux doivent être stockés dans / etc / bashrc.
  • Le fichier ~ /.BASH_PROFILE est le fichier de configuration préféré pour la configuration des environnements utilisateur individuellement. Dans ce fichier, les utilisateurs peuvent ajouter des options de configuration supplémentaires ou modifier les paramètres par défaut.
  • Tous les alias et fonctions locaux doivent être stockés dans ~ /.bashrc.

Gardez également à l'esprit que Linux est conçu pour être très flexible: si l'un des fichiers de démarrage nommés ci-dessus n'est pas présent sur votre système, vous pouvez le créer.

Liens et références

  • [1] GNU Bash, https: // www.gnou.org / logiciel / bash /
  • [2] Debian Almquist Shell (Dash), http: // Gondor.apana.org.Au / ~ Herbert / Dash /
  • [3] Zsh, https: // www.zsh.org /
  • [4] Certification du Linux Professional Institute (LPIC), niveau 1, https: // www.lpice.EU / EN / OO-CERTIFICATIONS / LPIC-1
  • [5] Grml, https: // grml.org /
  • [6] Différencier la connexion interactive et la coque non interactive non-login, Askubuntu, https: // askubuntu.com / Questions / 879364 / différencié-interactif-login-et-non-interactif-non-login-shell
  • [7] Bash Startup Files, https: // www.gnou.org / logiciel / bash / manual / html_node / bash-startup-files.html # bash-startup-files
  • [8] La boutique intégrée, https: // www.gnou.org / logiciel / bash / manual / html_node / the-shopt-builtin.html
  • [9] UNIX INTRODUCTION - BASH STARUP Fichiers de chargement Ordre, https: // Medium.com / @ Youngstone89 / Unix-introduction-bash-startup-files-wading-ordre-562543ac12e9
  • [10] Le Linux Documentation Project (TLDP), https: // tldp.org / ldp / bash-beginners-guide / html / sect_03_01.html

Merci

L'auteur tient à remercier Gerold Rupprecht pour ses conseils lors de la rédaction de cet article.