
Compatibilité de shells
Objectif
Le besoin est de configurer un compte Linux sous /bin/sh et de pouvoir l’exploiter à la demande sous /bin/bash.
La démarche de configuration de l’environnement de travail, se veut incrémentale. Il foit être possible de compléter ou modifier l’environnement par parties.
La démarche requiert une forte lisibilité/traçabilité par les usagers au regard des modifications environnementales réalisées.
Obstables rencontrés
Les incompatibilités entre /bin/sh et /bin/bash sont nombreuses, et je n’en dresserai pas ici une liste exhaustive, mais une liste des principales rencontrées.
objet | /bin/sh | /bin/bash |
---|---|---|
déclaration de variables | la syntaxe requiert une ligne de définition et une ligne d'export de variable | la syntaxe autorise de réaliser la définition et l'export en une seule ligne |
écriture écran en couleur | la fonction built-in echo ne rend pas les codes couleurs. | la fonction built-in echo restitue les code couleurs |
exécution de programme | Invocation uniquement entre back-quotes | Invocation entre back-quotes ou $() |
Les codes couleurs sont identiques. Pour les afficher sous les 2 shells, utiliser la fonction printf.
Pour l’exécution de programme, utiliser strictement l’approche /bin/sh.
Solution
Le shell de login de ce compte Linux est défini comme étant /bin/sh. Il utilise donc le fichier .profile pour positionner les éléments de l’environnement de travail. Ce fichier doit donc être compatible avec la syntaxe de /bin/sh.
L’usage de ce compte sous /bin/bash se réalise en entrant la commande shell bash -l, qui exploite également ce même fichier .profile. Qui plus est, le fichier .profile est paramétré pour charger le fichier .alias dans le cas où le shell exécuté est /bin/bash.
La démarche exige de spécifier pour chaque logiciel, outil, contexte, un fichier shell de positionnement de son environnement. Tous ces fichiers shells sont consignés dans le répertoire .config-sh sous le répertoire home du compte Linux considéré.
Code du fichier .profile
# exploitabilité sous licence https://choosealicense.com/licenses/gpl-3.0/
loadInShell() {
SF=${1:-xxx.xxx}
if [ -f $SF ]; then
echo
. $SF
else
echo $SF is not an existing file
fi
}
loadInShell .config-sh/color-profile.sh
BATCH_EXEC_ENV=TB
export BATCH_EXEC_ENV
loadInShell .config-sh/socle-profile.sh
loadInShell .config-sh/perl.sh
REAL_SHELL=`ps -p $$ -o comm | grep bash`
if [ "$REAL_SHELL" != "" ]; then
loadInShell $HOME/.alias
fi
Code du fichier color.profile.sh
# exploitabilité sous licence https://choosealicense.com/licenses/gpl-3.0/
RED='\033[0;31m'
GREEN='\033[0;32m'
ORANGE='\033[0;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
WHITE='\033[0;37m'
NC='\033[0m'
export RED GREEN ORANGE BLUE PURPLE CYAN WHITE NC
Code du fichier socle-profile.sh
# exploitabilité sous licence https://choosealicense.com/licenses/gpl-3.0/
BASE_FOLDER=$HOME/experimentation
export BASE_FOLDER
loadInShell $BASE_FOLDER/context-execution/1.1.3/set-all.sh
printf "${CYAN}----- SETTING SOCLE ENVIRONMENT - END -----${NC}\n"
Code du fichier perl.sh
# exploitabilité sous licence https://choosealicense.com/licenses/gpl-3.0/
printf "${CYAN}----- SETTING PERL 5.34 - START -----${NC}\n"
PATH=/usr/local/perl5.34/perl-5.34.0:$PATH
export PATH
printf "${ORANGE}PATH${NC} updated\n"
LD_LIBRARY_PATH=/usr/local/perl5.34/perl-5.34.0/lib:/usr/local/perl5.34/perl-5.34.0:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
printf "${ORANGE}LD_LIBRARY_PATH${NC} updated\n"
printf "${CYAN}----- SETTING PERL 5.34 - END -----${NC}\n"
Sortie écran
La lisibilité et traçabilité s’apprécie par l’image suivante.
Vérification de bon fonctionnement
Les vérifications ont été réalisées avec succès sur Red Hat 8.4 et sur Solaris 10.