Le livre dit:
En mode compatible POSIX, bash émulera sh.
Qu'est-ce que ça veut dire? Qu'entend-on par émulation en termes simples et profanes?
Ce n'est pas une chose Linux, c'est une chose bash. Bash n'est qu'un des nombreux coquillages. Bash est le "Bourne again Shell" et a été publié en remplacement du Bourne Shell original, sh
.
POSIX est un ensemble de normes définissant le fonctionnement des systèmes compatibles POSIX. Le standard POSIX Shell peut être trouvé ici . Bash possède de nombreuses fonctionnalités non présentes dans sh
et n'est pas réellement un shell compatible POSIX.
C'est pourquoi l'option --posix
est fournie. Comme expliqué dans man bash
(c'est moi qui souligne):
Si bash est appelé avec le nom sh, il essaie de reproduire le plus fidèlement possible le comportement au démarrage des versions historiques de sh, tout en respectant le standard POSIX. Lorsqu'il est appelé en tant que shell de connexion interactif ou non interactif avec l'option --login, il tente d'abord de lire et d'exécuter les commandes de/etc/profile et de ~/.profile, dans cet ordre. L'option --noprofile peut être utilisée pour inhiber ce comportement. Lorsqu'il est appelé en tant que shell interactif portant le nom sh, bash recherche la variable ENV, étend sa valeur si elle est définie et utilise la valeur développée comme nom de fichier à lire et à exécuter. . Puisqu’un shell appelé en tant que sh ne tente pas de lire et d’exécuter des commandes à partir d’autres fichiers de démarrage, l’option --rcfile n’a aucun effet . Un shell non interactif appelé avec le nom sh ne tente pas de lire d'autres fichiers de démarrage. Lorsqu'il est appelé en tant que sh, bash entre en mode posix après la lecture des fichiers de démarrage.
Lorsque bash est démarré en mode posix, comme pour l'option de ligne de commande --posix, il respecte la norme POSIX pour les fichiers de démarrage. Dans ce mode, les shells interactifs développent la variable ENV et les commandes sont lues et exécutées à partir du fichier dont le nom est la valeur développée. Aucun autre fichier de démarrage n'est lu.
Cela signifie que si vous exécutez sh
ou bash --posix
pour démarrer un shell interactif, votre fichier ~/.bahsrc
est ignoré et, à la place, le fichier enregistré sous le nom $ENV
(le cas échéant) est lu. Pour illustrer cela, j'ai ajouté echo "read .bashrc"
à mon ~/.bashrc
:
$ bash
read .bashrc ## message was printed, ~/.bashrc was read
$ sh
sh-4.3$ ## no message printed, ~/.bashrc was not read
Si je mets maintenant $ENV
:
$ export ENV="~/.bashrc"
$ sh
read .bashrc
NOTE IMPORTANTE : Ubuntu a choisi de faire de /bin/sh
un synlink vers /bin/dash
. Dash est un autre shell, en réalité compatible avec POSIX. Cela signifie que pour observer le comportement que j'ai décrit ci-dessus, vous devez utiliser un autre sh
.1. Sur Ubuntu, vous devez créer un fichier appelé sh
, qui est un lien symbolique vers /bin/bash
:
$ ln -s /bin/bash ~/sh
Vous avez maintenant un fichier appelé sh
dans votre répertoire personnel. Utilisez cela pour démontrer les différences que j'ai expliquées ci-dessus:
$ ls -l ~/sh
lrwxrwxrwx 1 terdon terdon 9 May 2 14:03 /home/terdon/sh -> /bin/bash
$ ~/sh
read .bashrc
1En fait, le comportement semblera identique, ~/.bashrc
sera ignoré, mais c'est simplement parce que dash
n'est pas bash
et n'a aucun problème à lire le ~/.bashrc
spécifique à bash de toute façon. Cependant, dash
ignore également $ENV
. Vous devez donc utiliser le lien vers /bin/bash
pour voir cela.