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 variablesla syntaxe requiert une ligne de définition et une ligne d'export de variablela syntaxe autorise de réaliser la définition et l'export en une seule ligne
écriture écran en couleurla fonction built-in echo ne rend pas les codes couleurs.la fonction built-in echo restitue les code couleurs
exécution de programmeInvocation uniquement entre back-quotesInvocation 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.