Contenu | Rechercher | Menus

Annonce

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 22/10/2021, à 12:15

philoeil

[RESOLU]Redirection sur read problème d'affichage

Bonjour,

C'est dans la continuité de mes 2 messages précédent ici : https://forum.ubuntu-fr.org/viewtopic.php?id=2067543
L'objet est d'avoir dans 2 modes d'executions (verbeux : j'affche tout sur stdout et nonVerbeux : Je n'affiche que les informations essentielles)
un affichage des commandes et informations sur
stdout, (afficher selon le choix Verbeux)
journal (afficher que les informations essentielles)
JournalErreur (afficher que les erreurs)
et JournalDeveloppeur (afficher tout)



Pour le code test suivant reproduisant mon erreur je n'arrive pas à traiter correctement la redirection
dans la partie commande read en mode NON VERBEUX:
en mode NON VERBEUX: Cette ligne affiche le résultat correctement dans Journal Developeur mais pas dans stdout

          2>&1 read -p " -Confirmer l'utilisation du nom >>>$NomActionDoublonsTxt<<<....... (Y pour Yes)" reponse 
 

en mode NON VERBEUX: Cette ligne s'affiche correctement dans stdout mais pas dans journal developpeur

  read -p " -Confirmer l'utilisation du nom >>>$NomActionDoublonsTxt<<<....... (Y pour Yes)" reponse 

Le code test complet :

#!/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

}



# 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







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"
# ----------------------------------------------------------- #
#  ________________________________________________________________________________________________________________________________________

exec 2>$tty   # Suspend la redirection d'erreur
exec 1>$tty # re affiche les commandes suivantes sur stdout et interrompt l'envoi de stdout au  journal developpeur (Commun mode Verbeux ou pas)
echo "Verbeux=$Verbeux"
exec 3<"$CheminActionDbl/MIR_CPCent.txt"

while IFS=$'\n' read -u3 D_CPC # While Boucle parcours des D_CPC
 
do # While Boucle parcours des D_CPC
   # <<<<<<<<<<<<<<<<

   echo -e "\n\\\\\\\\\\\\Envoyé au journal Developpeur et stdout mais PAS Journal\\\\\nJe suis dans le D_CPC\n $D_CPC\n"
done | my_logger

exec 3<&-
 FermeRedirectionS
#  _____________________________________Modif en cours ___________________________________________________________________________________________________
# test affichege dans bocle read
if [ ! "$Verbeux" == "true" ] # >>>>>>>>>>>>>>>>>>>>>>>>>>>  OUVRE la redirection stdout selon mode verbeux ou non Affiche texte suivant dans les 2 cas
then
 exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au  journal developpeur
echo -e "\n--------------------------------------------------------------------------------------\n Je controle la présence des répertoires et fichiers nécessaires pour construire la liste des doublons à éliminer nom de cette liste : ActionDoublons.txt \n----------------------------------------------------------------------------------------\n" | tee -a "$CheminJournal" | tee -a "$CheminJournalDeveloppeur"
FermeRedirectionS # Penser à lancer fonction FermeRedirection si non plus de passage des commandes dans le JournalDeveloppeur
else
echo -e "\n--------------------------------------------------------------------------------------\n Je controle la présence des répertoires et fichiers nécessaires pour construire la liste des doublons à éliminer nom de cette liste : ActionDoublons.txt  \n----------------------------------------------------------------------------------------\n" | tee -a "$CheminJournal"
fi
#   exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au  journal developpeur (Commun mode Verbeux ou pas)  
   NomActionDoublonsTxt="ActionDoublons.txt"
   exec 2>$tty   # Suspend la redirection d'erreur pour ne pas avoir les questions reponses de read dans le journal 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 [[ "$reponse" == "Y" ]] # untilReponse
     do # WhileReponse 

          2>&1 read -p " -Confirmer l'utilisation du nom >>>$NomActionDoublonsTxt<<<....... (Y pour Yes)" reponse # Cette ligne s'afficherait correctement dans Journal Developeur mais pas dans stdout
        
        #   read -p " -Confirmer l'utilisation du nom >>>$NomActionDoublonsTxt<<<....... (Y pour Yes)" reponse # Cette ligne s'afficherait correctement dans stdout mais pas dans journal developpeur 
            

     echo " reponse : $reponse" | tee -a "$CheminJournal" 

     


        if [[ $reponse == "Y" ]] # If RepNomActionDoublons
        then  # If RepNomActionDoublons
        echo " La reponse était Y "
        else # If RepNomActionDoublons
        echo "la reponse a été négative" | tee -a "$CheminJournal" 
        read -p " donner le nom au fichier à utiliser comme liste des doublons :" NomActionDoublonsTxt            
            
        fi # If RepNomActionDoublons
     done > >(my_logger)  
FermeRedirectionS # pour rétablir la redirection d'erreur
echo "une autre erreur volontaire ligne suivante, s'affiche dans journal erreur et stdout et journalDeveloppeur"
ls "2eme_fichierQuiNExistepas"








#  _____________________________________ FIN Modif en cours ___________________________________________________________________________________________________




# 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====================\n FIN Test redirection cette ligne n'apparait que dans Journal Developpeur, et pas dans stdout) mode verbeux false ($Verbeux) \n========================\n" 

    else # Verbeux=true
       exec 1> $tty  # Lie le descripteur de fichier #5 avec stdout Affiche tout sur stdout (Verbeux=true). 

       echo -e "\n====================\n FIN Test redirection Mode Verbeux= VRAI ($Verbeux) (n'apparait pas dans journal Developpeur) \n========================\n"
       echo -e "\n====================\n FIN Test redirection cette ligne n'apparait que dans Journal Developpeur) \n========================\n" >>"$CheminJournalDeveloppeur"
       echo -e "\n Affichage des journaux (et cette ligne apparait sur stdout (et pas dans JournalDeveloppeur) en mode verbeux=true $Verbeux)"

    fi

exec 1>&5 5>&-      # Restaure stdout et ferme le descripteur de fichier #
exec 1>$tty # re affiche les commandes suivantes sur stdout et interrompt l'envoi de stdout au  journal developpeur (Commun mode Verbeux ou pas)
cat "$CheminJournalErreur"
cat "$CheminJournal"
cat "$CheminJournalDeveloppeur" 

Merci pour votre attention

Dernière modification par philoeil (Le 22/10/2021, à 18:46)

Hors ligne

#2 Le 22/10/2021, à 15:16

kamaris

Re : [RESOLU]Redirection sur read problème d'affichage

Il faut que tu préserves la séparation stderr / stdout (donc pas de 2>&1), mais que tu t'occupes des deux en sortie de la boucle until où se trouve le read en question.
Car là tu ne gères que stdout par

     done > >(my_logger)

En reprenant ce qui est fait dans FermeRedirectionS,  il faudrait quelque chose comme

     done > >(my_logger) 2> >(tee -a "$CheminJournalDeveloppeur" >&2)

Hors ligne

#3 Le 22/10/2021, à 18:45

philoeil

Re : [RESOLU]Redirection sur read problème d'affichage

Bonjour,
C'est top!,
Merci et encore bravo pour cette expertise parfaite sur les redirections.

Je suis un peu confus de ne pas arriver à maîtriser encore ces redirections,
J'essaie tout de même de comprendre. Je progresse petit à petit ....

J'ai encore du boulot!
  lol

Hors ligne

#4 Le 22/10/2021, à 19:14

kamaris

Re : [RESOLU]Redirection sur read problème d'affichage

L'essentiel est de progresser, de toutes façons on n'a jamais tout compris smile
Au passage, concernant la petite fonction FermeRedirectionS, je pense qu'elle gagnerait à être réécrite comme ça :

FermeRedirectionS()
{
# A lancer aprs boucle select, while et read ...
 
exec 5>&1  # Lie le descripteur de fichier #5 avec stdout.
exec 2> >(tee -a "$CheminJournalErreur" "$CheminJournalDeveloppeur" "$CheminJournal" >&2) # envoie les erreurs dans les journaux et les affiche sur stderr

if [[ ! "$Verbeux" == "true" ]] # <<<<<<<<<<<<<<<<<<<<<<  ferme la redirection SELECT stdout selon mode verbeux ou non
then # verbeux=false
   echo "(info : FermeRedirectionS cas Verbeux=$Verbeux)"
   exec >>"$CheminJournalDeveloppeur"  # envoie stdout dans le CheminJournalDeveloppeur
else  # verbeux=true
   echo "(info : FermeRedirectionS cas Verbeux=$Verbeux)"

   # 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
fi

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 : 
}

C'est un peu plus clair (seules les parties qui dépendent du mode verbeux sont dans le if…else), et c'est probablement mieux comme ça pour le tee sur stderr.

Hors ligne

#5 Le 26/10/2021, à 21:04

philoeil

Re : [RESOLU]Redirection sur read problème d'affichage

Bonjour,

Merci bien Kamaris,

Effectivement c'est plus optimal, je prends
(désolé pour la réponse tardive je m'étais absenté)

Hors ligne