Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 13/10/2021, à 23:17

philoeil

[RESOLU] Redirection recherche solution dans appel fonction Menu

Bonjour,

C'est dans la continuité de mon problème précédent :
Forum question redirection boucle while

J'aimerai pouvoir envoyer dans le journalDeveloppeur les traces des choix faits par l'utilisateur (en mode verbeux true ou false)

Mon problème est que la solution précédente, ici ne marche pas
Dans la fonction MenuGeneral2 si je fais

 done | my_logger 

la variable devient $REPLY=0
et le retour de mon traitement select case ne prend plus en compte mon choix

Ma question : Comment faire la redirection et conserver la valeur de $REPLY ?

Le script test :

#!/bin/bash
# parametre forcé en local pour le test
CheminActionDbl="./"


my_logger ()
{
  if [[ "$Verbeux" == "true" ]]; then
    tee -a "$CheminJournalDeveloppeur"
  else
    cat >>"$CheminJournalDeveloppeur"
  fi
}

FermeRedirectionS()
{
# A lancer aprs boucle select, while et read ...
 
if [[ ! "$Verbeux" == "true" ]] # <<<<<<<<<<<<<<<<<<<<<<  ferme la redirection SELECT stdout selon mode verbeux ou non
then # verbeux=false
   echo "(info : FermeRedirectionS cas Verbeux=$Verbeux)"
exec 5>&1  # Lie le descripteur de fichier #5 avec stdout.
exec >>"$CheminJournalDeveloppeur"  # envoie stdout dans le #5 et dans le CheminJournalDeveloppeur

exec 2> >(tee -a "$CheminJournalErreur" >&2) # envoi les erreurs et les affiches sur stdout
exec 2> >(tee -a "$CheminJournalDeveloppeur" >&2) # envoi les erreurs et les affichent Dans journal developpeur
exec 2> >(tee -a "$CheminJournal" >&2) # envoi les erreurs dans #2 et chemin journal
sleep 0.01 # bricolage pour laisser le temps = petit temps d'attente avant de commencer à écrire directement sur la sortie standard, pour que la précédente écriture dans tee soit purgée : 
else  # verbeux=true
   echo "(info : FermeRedirectionS cas Verbeux=$Verbeux)"
exec 5>&1  # Lie le descripteur de fichier #5 avec stdout.

# A1 10/10/2021 ajout de cette ligne pour automatiser l'envoi des infos dans JournalDeveloppeur en mode verbuex = true
exec 1> >(tee -a "$CheminJournalDeveloppeur" >&1) # envoie stdout dans le #1 et dans le CheminJournalDeveloppeur

exec 2> >(tee -a "$CheminJournalErreur" >&2) # envoi les erreurs et les affiches sur stdout
exec 2> >(tee -a "$CheminJournal" >&2) # envoi les erreurs dans #2 et chemin journal
exec 2> >(tee -a "$CheminJournalDeveloppeur" >&2) # envoi les erreurs et les affichent Dans journal developpeur
sleep 0.01 # bricolage pour laisser le temps = petit temps d'attente avant de commencer à écrire directement sur la sortie standard, pour que la précédente écriture dans tee soit purgée : 
fi

}
MenuGeneral2()
{
echo -e "\n ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n       Menu general :\n" | tee -a "$CheminJournal" 
 exec 2>$tty   # Suspend la redirection d'erreur indispensable avant boucle select
 exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au  journal developpeur (Commun mode Verbeux ou pas)
   PS3="Choisir l'action (A) : "
   select itemAct2 in "- NON DISPONIBLE Choix Lancer Acton1 " "- NON DISPONIBLE Choix lancer action2 " "- Choix Construction Action3"  "- Choix (re)Construire Action 4" "- Menu Action5" "- Recherche Action 6" "- Fin du script" 
   do
   exec 2>>"$CheminJournalErreur" # Rétabli la redirection d'erreur
   echo -e "\fLe choix fait Le $DateJ à $HeureJ  $REPLY:$itemAct2" | tee -a "$CheminJournal" 
   # pour tester la variable de type entier :
         if let "$REPLY" 2>/dev/null
         then
         echo "choix conforme (c'est un nombre) "
            
             if [[ "$REPLY" -ge 3 ]]
            then
            echo " choix conforme : $REPLY"
 # A2 190921 inutil ?        FermeRedirectionS
            return
        
            else
            echo "choix au-delà des limites possibles
            Votre choix ? :"
            unset itemAct2
            fi

         else
         echo "Entrée erronée ! variable non numérique
         Votre choix ? :"
         unset itemAct2
         fi
   done 
# done | my_logger passerait à zero la valeur de $REPLY
}

# Parametres en local
DateJ=$(date +%Y%m%d)
HeureJ=$(date +%H%M)



# Apres appel fonction FermeRedirectionS affichage sur stdout seulement en mode verbeux des lignes qui suivent
#  et si redirection forcée  | tee -a "$CheminJournal" alors affichage dans JournalSauvegarde + JournalDeveloppeur
CheminJournalErreur="./JournalErreur_TestJournalRedir"
CheminJournal="./Journal_TestJournalRedir"
CheminJournalDeveloppeur="./JournalDeveloppeur_TestJournalRedir"

truncate -s 0 "$CheminJournalErreur"
truncate -s 0 "$CheminJournalDeveloppeur"
truncate -s 0 "$CheminJournal"

read -p "choisir le mode d'affichage (Y pour Verbeux) :" reponse2
   if [[ "$reponse2" == "Y" ]] # If repon2
      then   # If repon2
         echo " La reponse était Y (mode verbeux choisi)" 
 Verbeux=true
# inutile ?
#  declare -i Verbeux=true
    else
       echo " mode non verbeux choisi"
 Verbeux=false
# inutile ?
# declare -i Verbeux=false
    fi
echo "Verbeux=$Verbeux"

   echo "Début des Redirections selon mode verbeux ou pas, à partir d'ici tous les affichages son redirigés selon le mode choisi "

    tty=$(tty) # passe stdout dans une variable

echo -e "\n DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\n Journal Developpeur\n" > "$CheminJournalDeveloppeur"
echo -e "\n EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n Journal Erreur\n" > "$CheminJournalErreur"
echo -e "\n JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ\n Journal \n" > "$CheminJournal"
 # ===============================Début des Redirections selon mode verbeux ou pas===========================================================================
   FermeRedirectionS
   if [ "$Verbeux" == "true" ] # IF Verbeux
   then # IF Verbeux Mode Verbeux TRUE

      echo -e "\n mode Verbeux=$Verbeux choisi (true attendu)"
   echo -e "\nToute sortie des commandes sera envoyée\t  dans le fichier JournalDeveloppeur\t et affichée sur stdout\net les erreurs s'affiche dans stdout, Journal, JournalDeveloppeur\f"
   else
      echo -e "\n mode Verbeux=$Verbeux choisi (false attendu)"

      echo -e "\nToute sortie des commandes s'affiche dans journal Developpeur uniquement (pas sur stdout)"
      echo -e "Seuls Les erreurs sont envoyées dans stdout et "'$CheminJournalErreur'"et dans le JournalDeveloppeur\n\f"

   fi




exec 2>$tty   # Suspend la redirection d'erreur
exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au  journal developpeur (Commun mode Verbeux ou pas)
echo -e "\nSi appel d'une fonction read, select, while.... nécessité de suspendre les redirections Erreur et réafficher tous les messages sur STDOUT \net de les rétablir après  avec la fonction FermeRedirectionS (dans ce mode rien n'est envoyé dans JournalDeveloppeur : sauf si emploi d'une redirection explicite)"
echo -e "s'il est souhaité dans ce mode (redirections suspendues) d'envoyer des informations vers les journaux, faire les renvois classiques :" | tee -a "$CheminJournal"

echo "Ainsi pour journal uniquement : >>\$CheminJournal" >> "$CheminJournal"
echo "Ainsi pour journal et STDOUT : | tee -a \$CheminJournal" | tee -a "$CheminJournal"




FermeRedirectionS # Ferme l'affichage sur stdout en activant les redirections prédéfinies





#Mode je n'affiche que dans cas Verbeux =TRUE
    if [ ! "$Verbeux" == "true" ]  #<<<<<<<<<<<<<<<<<<<<<<  ferme la redirection stdout selon mode verbeux ou non AFFICHAGE TEXTE SEULEMENT SI VERBEUX=TRUE
    then # Verbeux=false
      echo -e "\n\nAprès appel de la fonction FermeRedirectionS,\t Cette ligne ne peut être affichée sur STDOUT (en mode Verbeux=false) elle est affichée dans CheminDeveloppeur et CheminJournal\f" | tee -a "$CheminJournal"
      echo -e "\n\nAprès appel de la fonction FermeRedirectionS\t Cette ligne est envoyée dans CheminDeveloppeur uniquement\f" 
      echo -e "\n\n Après appel de la fonction FermeRedirectionS\t Cette ligne est envoyée uniquement dans CheminJournal \f" >>"$CheminJournal"

   else # Verbeux=true
      echo -e "\n\nAprès appel de la fonction FermeRedirectionS,\t Cette ligne est envoyée (sur stdout en mode Verbeux=Vrai) et dans CheminDeveloppeur et CheminJournal\f" | tee -a "$CheminJournal" 
      echo -e "\n\nAprès appel de la fonction FermeRedirectionS\t Cette ligne est envoyée dans CheminDeveloppeur uniquement\f" >>"$CheminJournalDeveloppeur"
      echo -e "\n\n Après appel de la fonction FermeRedirectionS\t Cette ligne est envoyée uniquement dans CheminJournal\f" >>"$CheminJournal"
        fi




echo -n "Fichier traces : ne s'affiche que dans journal developpeur en mode Verbeux Faux "
date
echo "-------------------------------------"
echo
echo "une erreur volontaire ligne suivante, s'affiche dans journal erreur et stdout et journalDeveloppeur"
ls "fichierQuiNExistepas"
# ----------------------------------------------------------- #
# Debut tentative C ________________________________________________________________________________________________________________________________________

# Boucle parcours des D_CPC
# les echo ne s'affiche que dans journal developpeur en mode Verbeux Faux "

echo "Test 2 boucles imbriquées avec 1 appel de fonction"
# appel menu general

 REPLY=0 # nécessaire pour ne pas partir sur réponse précédente
exec 2>$tty   # Suspend la redirection d'erreur
exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au  journal developpeur (Commun mode Verbeux ou pas)
until [ "$REPLY" -eq 7 ]
do

MenuGeneral2
echo "le retour de REPLY = $REPLY"
   # echo "Le choix fait $REPLY:$itemAct2"
   case "$REPLY" in
      1)
         echo "choix 1 lancé"
         ;;
      2)
         echo "choix 2 lancé"
         ;;
      3)
         echo "choix 3 lancé"
         ;;
      4)
         echo "choix 4 lancé"
         ;;
      5)
         echo "choix 5 lancé"
         ;;
      6)
         echo "choix 6 lancé"
         ;;
      7)
         echo "Fin...." | tee -a "$CheminJournal"  
         ;;
       *)
         echo "Choix incorrect "
      ;;
      esac
        
done | my_logger

Dernière modification par philoeil (Le 14/10/2021, à 21:25)

Hors ligne

#2 Le 14/10/2021, à 08:23

kamaris

Re : [RESOLU] Redirection recherche solution dans appel fonction Menu

C'est parce que le pipe lance le select dans un sous-processus, avec un environnement distinct de celui du script (initialisé comme une copie de celui du script, mais il n'y a pas de communication dans l'autre sens).
Pour éviter cela, tu peux utiliser une substitution de processus au lieu d'un pipe :

done > >(my_logger)

Ainsi my_logger est exécuté dans un sous-processus, mais pas le select.

Hors ligne

#3 Le 14/10/2021, à 21:24

philoeil

Re : [RESOLU] Redirection recherche solution dans appel fonction Menu

Bonjour,

Merci Kamaris
Ta solution est parfaite
et tes explications toujours les bienvenue

Je désespère de faire le tour des mutiples possibilités de redirections en tout genre...:rolleyes:

Merci encore

Hors ligne