web-dev-qa-db-fra.com

Qu'est-ce que le mode compatible POSIX sous Linux?

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?

3

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.

8
terdon