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 11/10/2021, à 20:00

philoeil

[RESOLU] recherche solution redirection dans une boucle While

Bonjour,

J'ai un petit script test qui m'aide  pour maitriser mes redirections dans un script,
j'ai reproduis dedans le problème que je souhaite résoudre, je l'ai inséré entre

# Debut tentative reproduction erreur D_CPC ________________________________________________________________________________________________________________________________________

# Fin tentative reproduction erreur D_CPC  ________________________________________________________________________________________________________________________________________

dans le script complet le contenu de la boucle while est long

L'objectif est le suivant :
Je souhaite envoyer tout ce qui se déroule dans une boucle While dans le fichier contenu dans "$CheminJournalDeveloppeur"
(quelque soit le mode verbeux choisi vrai ou faux)

Le script

#!/bin/bash
# parametre forcé en local pour la recherche d'erreur
CheminActionDbl="./"



FermeRedirectionS()
{
# A lancer aprs boucle select, while et read ...
 
if [[ ! "$Verbeux" == "true" ]] # <<<<<<<<<<<<<<<<<<<<<<  ferme la redirection SELECT stdout selon mode verbeux ou non
then
echo "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

else
echo "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

fi

}

# 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
    else
       echo " mode non verbeux choisi"
Verbeux=false

    fi
   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===========================================================================
   if [ "$Verbeux" == "true" ] # IF Verbeux
   then # IF Verbeux Mode Verbeux TRUE
   exec 1> >(tee -a "$CheminJournalDeveloppeur" >&1) # envoie stdout dans le #1 et dans le CheminJournalDeveloppeur
   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
   echo " mode Verbeux=VRAI choisi"
   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"
   # Toute sortie des commandes sera envoyée dans le fichier JournalDeveloppeur et affiché sur stdout
   
   else # Mode verbeux FALSE
   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
    exec 5>&1  # Lie le descripteur de fichier #5 avec stdout.
   exec >>"$CheminJournalDeveloppeur"  # envoie stdout dans le #5 et dans le CheminJournalDeveloppeur ATTENTION >> plus rien ne s'affiche sur stdout
   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 # IF Verbeux




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


# Debut tentative reproduction erreur D_CPC ________________________________________________________________________________________________________________________________________

# Boucle parcours des D_CPC
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)

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\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\nJe suis dans le D_CPC\n $D_CPC\n"

done
exec 3<&-
 FermeRedirectionS



# Fin tentative reproduction erreur D_CPC  ________________________________________________________________________________________________________________________________________



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

#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 commande suivante sur stdout et interrompt l'envoi de stdout au  journal developpeur (Commun mode Verbeux ou pas)
cat "$CheminJournalErreur"
cat "$CheminJournal"
cat "$CheminJournalDeveloppeur" 

Le résultat qui ne convient pas (j'aimerai avoir dans la partie JournalDeveloppeur le contenu de Stdout de la boucle while)

$ ./TestJournalRedir4_ErreurCPC.sh 
choisir le mode d'affichage (Y pour Verbeux) :Y
 La reponse était Y (mode verbeux choisi)
Début des Redirections selon mode verbeux ou pas, à partir d'ici tous les affichages son redirigés selon le mode choisi 

Si appel d'une fonction read, select, while.... nécessité de suspendre les redirections Erreur et réafficher tous les messages sur STDOUT 
et 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)
 mode Verbeux=VRAI choisi

Toute sortie des commandes sera envoyée	  dans le fichier JournalDeveloppeur	 et affichée sur stdout
et les erreurs s'affiche dans stdout, Journal, JournalDeveloppeur

s'il est souhaité dans ce mode (redirections suspendues) d'envoyer des informations vers les journaux, faire les renvois classiques :
Ainsi pour journal et STDOUT : | tee -a $CheminJournal
FermeRedirectionS cas Verbeux=true

\\\\\\\\\\\\\\nJe suis dans le D_CPC
 /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/A/AA_FichCach/AAA


\\\\\\\\\\\\\\nJe suis dans le D_CPC
 /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/D/DD/DDD/AAAMiroirPLUS


\\\\\\\\\\\\\\nJe suis dans le D_CPC
 /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/B/BB/MirEgalAA


\\\\\\\\\\\\\\nJe suis dans le D_CPC
 /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/C/AAAMiroirMoins


\\\\\\\\\\\\\\nJe suis dans le D_CPC
 /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/A/AA_FichCach

FermeRedirectionS cas Verbeux=true


Après appel de la fonction FermeRedirectionS,	 Cette ligne est envoyée (sur stdout en mode Verbeux=Vrai) et dans CheminDeveloppeur et CheminJournal

Fichier traces : ne s'affiche que dans journal developpeur en mode Verbeux Faux lundi 11 octobre 2021, 19:35:04 (UTC+0200)
-------------------------------------

une erreur volontaire ligne suivante, s'affiche dans journal erreur et stdout et journalDeveloppeur
ls: impossible d'accéder à 'fichierQuiNExistepas': Aucun fichier ou dossier de ce type

====================
 FIN Test redirection Mode Verbeux= VRAI (true) (n'apparait pas dans journal Developpeur) 
========================


 Affichage des journaux (et cette ligne apparait sur stdout (et pas dans JournalDeveloppeur) en mode verbeux=true true)

 EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
 Journal Erreur

ls: impossible d'accéder à 'fichierQuiNExistepas': Aucun fichier ou dossier de ce type

 JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
 Journal 

s'il est souhaité dans ce mode (redirections suspendues) d'envoyer des informations vers les journaux, faire les renvois classiques :
Ainsi pour journal uniquement : >>$CheminJournal
Ainsi pour journal et STDOUT : | tee -a $CheminJournal


Après appel de la fonction FermeRedirectionS,	 Cette ligne est envoyée (sur stdout en mode Verbeux=Vrai) et dans CheminDeveloppeur et CheminJournal



 Après appel de la fonction FermeRedirectionS	 Cette ligne est envoyée uniquement dans CheminJournal

ls: impossible d'accéder à 'fichierQuiNExistepas': Aucun fichier ou dossier de ce type

 DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
 Journal Developpeur

 mode Verbeux=VRAI choisi

Toute sortie des commandes sera envoyée	  dans le fichier JournalDeveloppeur	 et affichée sur stdout
et les erreurs s'affiche dans stdout, Journal, JournalDeveloppeur



Après appel de la fonction FermeRedirectionS,	 Cette ligne est envoyée (sur stdout en mode Verbeux=Vrai) et dans CheminDeveloppeur et CheminJournal



Après appel de la fonction FermeRedirectionS	 Cette ligne est envoyée dans CheminDeveloppeur uniquement

Fichier traces : ne s'affiche que dans journal developpeur en mode Verbeux Faux lundi 11 octobre 2021, 19:35:04 (UTC+0200)
-------------------------------------

une erreur volontaire ligne suivante, s'affiche dans journal erreur et stdout et journalDeveloppeur
ls: impossible d'accéder à 'fichierQuiNExistepas': Aucun fichier ou dossier de ce type

====================
 FIN Test redirection cette ligne n'apparait que dans Journal Developpeur) 
========================

Le contenu de "$CheminActionDbl/MIR_CPCent.txt"

$ cat MIR_CPCent.txt 
/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/A/AA_FichCach/AAA
/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/D/DD/DDD/AAAMiroirPLUS
/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/B/BB/MirEgalAA
/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/C/AAAMiroirMoins
/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/A/AA_FichCach


Merci

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

Hors ligne

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

kamaris

Re : [RESOLU] recherche solution redirection dans une boucle While

Normalement il te suffit de rajouter la redirection après le done :

while …; do
  …
done >"$CheminJournalDeveloppeur"

Hors ligne

#3 Le 12/10/2021, à 07:42

philoeil

Re : [RESOLU] recherche solution redirection dans une boucle While

Bonjour,

Et merci bien Kamaris
La piste était la bonne

Pour info

done | >"$CheminJournalDeveloppeur"

ne marche pas car ecrase la première partie de ce qui a été envoyé dans $CheminJournalDeveloppeur

par contre est OK :

done | >>"$CheminJournalDeveloppeur"

 

Pour envoyer les données sur stdout et Journal developpeur j'ai trouvé

done | tee -a "$CheminJournalDeveloppeur"

En début de script est choisi le mode de redirection des données :
verbeux=true pour le choix utilisateur = >envoyer les affichages dans stdout + journal + journaldeveloppeur
verbeux=false pour le choix utilisateur => envoyer les affichages dans  journaldeveloppeur

Ma nouvelle question : comment pourrais-je faire en fonction de la valeur verbeux pour que la redirection de la boucle while soit
mode verbeux :

done | tee -a "$CheminJournalDeveloppeur"

envoi les données sur stdout et Journal developpeur

mode non verbeux :

done | >>"$CheminJournalDeveloppeur"

une suggestion ?

Hors ligne

#4 Le 12/10/2021, à 09:02

iznobe

Re : [RESOLU] recherche solution redirection dans une boucle While

Bonjour , le plus simple est de faire une condition sur le mode verbeux et d ' ecrire deux fois la boucle avec le done adequat .


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#5 Le 12/10/2021, à 09:07

kamaris

Re : [RESOLU] recherche solution redirection dans une boucle While

Plutôt une petite fonction qui se charge de ça, avec le "booléen" pour le mode verbeux en variable globale (il ne faut pas en abuser, mais c'est assez légitime dans ce cas) :

my_logger ()
{
  if ((verbose)); then
    tee -a "$CheminJournalDeveloppeur"
  else
    cat >>"$CheminJournalDeveloppeur"
  fi
}

declare -i verbose=0

… # on change probablement la valeur de 'verbose' ici

while …; do
  …
done | my_logger

Dernière modification par kamaris (Le 12/10/2021, à 09:11)

Hors ligne

#6 Le 12/10/2021, à 11:57

credenhill

Re : [RESOLU] recherche solution redirection dans une boucle While

hello

philoeil a écrit :

Pour info

done | >"$CheminJournalDeveloppeur"

ne marche pas car ecrase la première partie de ce qui a été envoyé dans $CheminJournalDeveloppeur

pourquooi un | après done ?

Hors ligne

#7 Le 12/10/2021, à 13:34

philoeil

Re : [RESOLU] recherche solution redirection dans une boucle While

Bonjour,
Merci Iznobe

Iznobe : a écrit :

le plus simple est de faire une condition sur le mode verbeux et d ' ecrire deux fois la boucle avec le done adequat .

Ce serait inadapté, la boucle while est trop grande

Merci credenhill
C'est une erreur de frappe (sans conséquence)

Merci Kamaris cela me semble être ce que je cherchais, je vais essayer.

Kamaris :  a écrit :

il ne faut pas en abuser,

pourquoi cette remarque ?

Hors ligne

#8 Le 12/10/2021, à 15:07

kamaris

Re : [RESOLU] recherche solution redirection dans une boucle While

Parce que ça rend les programmes moins sûrs, moins faciles à maintenir et souvent moins lisibles.
Une variable globale peut être modifiée partout, par n'importe qui, c'est donc difficile à suivre et plus difficile à débuguer.
Il vaut donc mieux écrire des fonctions qui n'utilisent que leurs arguments d'entrée et des variables locales, autant que possible.
Mais là, pour verbose, on peut considérer que c'est une propriété du script, donc le fait que ce soit global n'est pas choquant.

Hors ligne

#9 Le 12/10/2021, à 15:46

philoeil

Re : [RESOLU] recherche solution redirection dans une boucle While

Bonjour,
Merci Kamaris
Pour Variable globale : c'est bien compris

Pour le test je n'arrive pas à mettre en œuvre correctement ta solution, j'ai 2 problèmes :

J'ai un peu changé mon script test de départ le (re)voici et j'ai tenté d'incorporer les évolutions:

#!/bin/bash
# parametre forcé en local pour la recherche d'erreur
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

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

fi

}

# 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 reproduction erreur D_CPC ________________________________________________________________________________________________________________________________________

# Boucle parcours des D_CPC


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 "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\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\nJe suis dans le D_CPC\n $D_CPC\n"
done | my_logger

exec 3<&-
 FermeRedirectionS



# Fin tentative reproduction erreur D_CPC  ________________________________________________________________________________________________________________________________________

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

problème 1 : le mode verbeux true marche mais pas le mode verbeux false
Resultat verbeux=true

$ ./TestJournalRedir6.sh 
choisir le mode d'affichage (Y pour Verbeux) :Y
 La reponse était Y (mode verbeux choisi)
Verbeux=true
Début des Redirections selon mode verbeux ou pas, à partir d'ici tous les affichages son redirigés selon le mode choisi 
(info : FermeRedirectionS cas Verbeux=true)

Si appel d'une fonction read, select, while.... nécessité de suspendre les redirections Erreur et réafficher tous les messages sur STDOUT 
et 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)

 mode Verbeux=true choisi (true attendu)

Toute sortie des commandes sera envoyée	  dans le fichier JournalDeveloppeur	 et affichée sur stdout
et les erreurs s'affiche dans stdout, Journal, JournalDeveloppeur

s'il est souhaité dans ce mode (redirections suspendues) d'envoyer des informations vers les journaux, faire les renvois classiques :
Ainsi pour journal et STDOUT : | tee -a $CheminJournal
(info : FermeRedirectionS cas Verbeux=true)


Après appel de la fonction FermeRedirectionS,	 Cette ligne est envoyée (sur stdout en mode Verbeux=Vrai) et dans CheminDeveloppeur et CheminJournal

Fichier traces : ne s'affiche que dans journal developpeur en mode Verbeux Faux mardi 12 octobre 2021, 15:21:11 (UTC+0200)
-------------------------------------

une erreur volontaire ligne suivante, s'affiche dans journal erreur et stdout et journalDeveloppeur
ls: impossible d'accéder à 'fichierQuiNExistepas': Aucun fichier ou dossier de ce type
Verbeux=true

\\\\\\\\\\\\\\nJe suis dans le D_CPC
 /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/A/AA_FichCach/AAA


\\\\\\\\\\\\\\nJe suis dans le D_CPC
 /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/D/DD/DDD/AAAMiroirPLUS


\\\\\\\\\\\\\\nJe suis dans le D_CPC
 /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/B/BB/MirEgalAA


\\\\\\\\\\\\\\nJe suis dans le D_CPC
 /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/C/AAAMiroirMoins


\\\\\\\\\\\\\\nJe suis dans le D_CPC
 /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/A/AA_FichCach

(info : FermeRedirectionS cas Verbeux=true)

====================
 FIN Test redirection Mode Verbeux= VRAI (true) (n'apparait pas dans journal Developpeur) 
========================


 Affichage des journaux (et cette ligne apparait sur stdout (et pas dans JournalDeveloppeur) en mode verbeux=true true)

 EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
 Journal Erreur

ls: impossible d'accéder à 'fichierQuiNExistepas': Aucun fichier ou dossier de ce type

 JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
 Journal 

s'il est souhaité dans ce mode (redirections suspendues) d'envoyer des informations vers les journaux, faire les renvois classiques :
Ainsi pour journal uniquement : >>$CheminJournal
Ainsi pour journal et STDOUT : | tee -a $CheminJournal


Après appel de la fonction FermeRedirectionS,	 Cette ligne est envoyée (sur stdout en mode Verbeux=Vrai) et dans CheminDeveloppeur et CheminJournal



 Après appel de la fonction FermeRedirectionS	 Cette ligne est envoyée uniquement dans CheminJournal

ls: impossible d'accéder à 'fichierQuiNExistepas': Aucun fichier ou dossier de ce type

 DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
 Journal Developpeur


 mode Verbeux=true choisi (true attendu)

Toute sortie des commandes sera envoyée	  dans le fichier JournalDeveloppeur	 et affichée sur stdout
et les erreurs s'affiche dans stdout, Journal, JournalDeveloppeur



Après appel de la fonction FermeRedirectionS,	 Cette ligne est envoyée (sur stdout en mode Verbeux=Vrai) et dans CheminDeveloppeur et CheminJournal



Après appel de la fonction FermeRedirectionS	 Cette ligne est envoyée dans CheminDeveloppeur uniquement

Fichier traces : ne s'affiche que dans journal developpeur en mode Verbeux Faux mardi 12 octobre 2021, 15:21:11 (UTC+0200)
-------------------------------------

une erreur volontaire ligne suivante, s'affiche dans journal erreur et stdout et journalDeveloppeur
ls: impossible d'accéder à 'fichierQuiNExistepas': Aucun fichier ou dossier de ce type

\\\\\\\\\\\\\\nJe suis dans le D_CPC
 /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/A/AA_FichCach/AAA


\\\\\\\\\\\\\\nJe suis dans le D_CPC
 /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/D/DD/DDD/AAAMiroirPLUS


\\\\\\\\\\\\\\nJe suis dans le D_CPC
 /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/B/BB/MirEgalAA


\\\\\\\\\\\\\\nJe suis dans le D_CPC
 /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/C/AAAMiroirMoins


\\\\\\\\\\\\\\nJe suis dans le D_CPC
 /home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/T7Racine/A/AA_FichCach


====================
 FIN Test redirection cette ligne n'apparait que dans Journal Developpeur) 
========================

En mode verbeux false je souhaite avoir le retour dans le journal developpeur des resultats de la boucle while, et je n'ai rien
mode verbeux = false

$ ./TestJournalRedir6.sh 
choisir le mode d'affichage (Y pour Verbeux) :n
 mode non verbeux choisi
Verbeux=false
Début des Redirections selon mode verbeux ou pas, à partir d'ici tous les affichages son redirigés selon le mode choisi 
(info : FermeRedirectionS cas Verbeux=false)

Si appel d'une fonction read, select, while.... nécessité de suspendre les redirections Erreur et réafficher tous les messages sur STDOUT 
et 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)
s'il est souhaité dans ce mode (redirections suspendues) d'envoyer des informations vers les journaux, faire les renvois classiques :
Ainsi pour journal et STDOUT : | tee -a $CheminJournal
(info : FermeRedirectionS cas Verbeux=false)
ls: impossible d'accéder à 'fichierQuiNExistepas': Aucun fichier ou dossier de ce type
Verbeux=false

 DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
 Journal Developpeur


 mode Verbeux=false choisi (false attendu)

Toute sortie des commandes s'affiche dans journal Developpeur uniquement (pas sur stdout)
Seuls Les erreurs sont envoyées dans stdout et $CheminJournalErreuret dans le JournalDeveloppeur




Après appel de la fonction FermeRedirectionS,	 Cette ligne ne peut être affichée sur STDOUT (en mode Verbeux=false) elle est affichée dans CheminDeveloppeur et CheminJournal



Après appel de la fonction FermeRedirectionS	 Cette ligne est envoyée dans CheminDeveloppeur uniquement

Fichier traces : ne s'affiche que dans journal developpeur en mode Verbeux Faux mardi 12 octobre 2021, 15:29:26 (UTC+0200)
-------------------------------------

une erreur volontaire ligne suivante, s'affiche dans journal erreur et stdout et journalDeveloppeur
ls: impossible d'accéder à 'fichierQuiNExistepas': Aucun fichier ou dossier de ce type
(info : FermeRedirectionS cas Verbeux=false)

 EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
 Journal Erreur

ls: impossible d'accéder à 'fichierQuiNExistepas': Aucun fichier ou dossier de ce type

 JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
 Journal 

s'il est souhaité dans ce mode (redirections suspendues) d'envoyer des informations vers les journaux, faire les renvois classiques :
Ainsi pour journal uniquement : >>$CheminJournal
Ainsi pour journal et STDOUT : | tee -a $CheminJournal


Après appel de la fonction FermeRedirectionS,	 Cette ligne ne peut être affichée sur STDOUT (en mode Verbeux=false) elle est affichée dans CheminDeveloppeur et CheminJournal



 Après appel de la fonction FermeRedirectionS	 Cette ligne est envoyée uniquement dans CheminJournal 

ls: impossible d'accéder à 'fichierQuiNExistepas': Aucun fichier ou dossier de ce type

 DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
 Journal Developpeur


 mode Verbeux=false choisi (false attendu)

Toute sortie des commandes s'affiche dans journal Developpeur uniquement (pas sur stdout)
Seuls Les erreurs sont envoyées dans stdout et $CheminJournalErreuret dans le JournalDeveloppeur




Après appel de la fonction FermeRedirectionS,	 Cette ligne ne peut être affichée sur STDOUT (en mode Verbeux=false) elle est affichée dans CheminDeveloppeur et CheminJournal



Après appel de la fonction FermeRedirectionS	 Cette ligne est envoyée dans CheminDeveloppeur uniquement

Fichier traces : ne s'affiche que dans journal developpeur en mode Verbeux Faux mardi 12 octobre 2021, 15:29:26 (UTC+0200)
-------------------------------------

une erreur volontaire ligne suivante, s'affiche dans journal erreur et stdout et journalDeveloppeur
ls: impossible d'accéder à 'fichierQuiNExistepas': Aucun fichier ou dossier de ce type

====================
 FIN Test redirection cette ligne n'apparait que dans Journal Developpeur, et pas dans stdout) mode verbeux false (false) 
========================

Le second problème qui existait déjà avant, je ne l'avais pas vu : il y a une inversion dans l'ordre des affichages des points suivant,
Pourquoi ? et est-ce resolvable ? :

Ce texte

Si appel d'une fonction read, select, while.... nécessité de suspendre les redirections Erreur et réafficher tous les messages sur STDOUT 
et 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)

s'affiche dans stdout avant

Toute sortie des commandes sera envoyée	  dans le fichier JournalDeveloppeur	 et affichée sur stdout
et les erreurs s'affiche dans stdout, Journal, JournalDeveloppeur

alors que dans le script le déroulement est inverse

   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

Merci pour vos précieuses explications, j'espère que mes réponses ne sont pas trop longues et ne vous dissuadent pas de me répondre.
J'essaie d'être précis et complet, cela me semble plus facile pour les bonnes volontés qui veulent bien me lire...

Hors ligne

#10 Le 12/10/2021, à 15:59

kamaris

Re : [RESOLU] recherche solution redirection dans une boucle While

Pour le premier point, ton ordi a mal fait le copier-coller wink
C'est

cat >>"$CheminJournalDeveloppeur"

et pas

cat "$CheminJournalDeveloppeur"

Pour le second point, tu dois probablement avoir des processus qui écrivent sur stdout et/ou stderr en parallèle (les processus "tubés" avec '|' sont lancés en parallèle).
Dans ce cas, l'inversion est aléatoire : si tu veux vraiment y échapper, il faut repenser ton affaire, au moins localement.

Hors ligne

#11 Le 12/10/2021, à 20:39

philoeil

Re : [RESOLU] recherche solution redirection dans une boucle While

Bonjour,

Merci Kamaris, c'est tout bon
et merci de ta patience....:rolleyes:

Pour le problème 2, je continue à chercher comment maîtriser ce problème qui ne me semble pas aléatoire puisqu'il est constant dans son résultat "affichage faux"
Si quelqu'un veut tester tous les éléments sont dans le script simplifié ci-dessous qui reproduit "brillament" le problème sur le mode verbeux=true

Je ne vois pas de tube mais il y a des processus en parallèle,

Le script :

#!/bin/bash
# parametre forcé en local pour la recherche d'erreur
CheminActionDbl="./"
 
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 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
exec 5>&1  # Lie le descripteur de fichier #5 avec stdout.
exec >>"$CheminJournalDeveloppeur"  # envoie stdout dans le #5 et dans le CheminJournalDeveloppeur

else  # verbeux=true
   echo "(info : FermeRedirectionS cas Verbeux=$Verbeux)"

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

fi

}

# 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
    else
       echo " mode non verbeux choisi"
 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 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au  journal developpeur (Commun mode Verbeux ou pas)
exec 2>$tty   # Suspend la redirection d'erreur
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====================\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" 

L'erreur : inversion de l'affichage des 2 lignes suivantes

Si appel d'une fonction read, select, while.... nécessité de suspendre les redirections Erreur et réafficher tous les messages sur STDOUT 
et 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)

et

Toute sortie des commandes sera envoyée	  dans le fichier JournalDeveloppeur	 et affichée sur stdout
et les erreurs s'affiche dans stdout, Journal, JournalDeveloppeur

le resultat complet de l'execution du script :

$ ./TestJournalRedir7.sh 
choisir le mode d'affichage (Y pour Verbeux) :Y
 La reponse était Y (mode verbeux choisi)
Verbeux=true
Début des Redirections selon mode verbeux ou pas, à partir d'ici tous les affichages son redirigés selon le mode choisi 
(info : FermeRedirectionS cas Verbeux=true)

Si appel d'une fonction read, select, while.... nécessité de suspendre les redirections Erreur et réafficher tous les messages sur STDOUT 
et 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)

 mode Verbeux=true choisi (true attendu)

Toute sortie des commandes sera envoyée	  dans le fichier JournalDeveloppeur	 et affichée sur stdout
et les erreurs s'affiche dans stdout, Journal, JournalDeveloppeur

s'il est souhaité dans ce mode (redirections suspendues) d'envoyer des informations vers les journaux, faire les renvois classiques :
Ainsi pour journal et STDOUT : | tee -a $CheminJournal
(info : FermeRedirectionS cas Verbeux=true)

====================
 FIN Test redirection Mode Verbeux= VRAI (true) (n'apparait pas dans journal Developpeur) 
========================


 Affichage des journaux (et cette ligne apparait sur stdout (et pas dans JournalDeveloppeur) en mode verbeux=true true)

 EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
 Journal Erreur


 JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
 Journal 

s'il est souhaité dans ce mode (redirections suspendues) d'envoyer des informations vers les journaux, faire les renvois classiques :
Ainsi pour journal uniquement : >>$CheminJournal
Ainsi pour journal et STDOUT : | tee -a $CheminJournal

 DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
 Journal Developpeur


 mode Verbeux=true choisi (true attendu)

Toute sortie des commandes sera envoyée	  dans le fichier JournalDeveloppeur	 et affichée sur stdout
et les erreurs s'affiche dans stdout, Journal, JournalDeveloppeur


====================
 FIN Test redirection cette ligne n'apparait que dans Journal Developpeur) 
========================

Hors ligne

#12 Le 12/10/2021, à 21:00

kamaris

Re : [RESOLU] recherche solution redirection dans une boucle While

Tu peux ajouter un 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 :

…
sleep 0.1
exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au  journal developpeur (Commun mode Verbeux ou pas)
…

Ou bien intégrer ce temps d'attente à une petite fonction de logging comme on a fait plus haut, en l'utilisant à la place de tee dans la redirection

exec 1> >(tee -a "$CheminJournalDeveloppeur" >&1) # envoie stdout dans le #1 et dans le CheminJournalDeveloppeur

Mais bon, ça ne sera toujours que du bricolage, car ce temps peut varier…

Hors ligne

#13 Le 12/10/2021, à 21:50

philoeil

Re : [RESOLU] recherche solution redirection dans une boucle While

Bonjour,

Champion ! Kamaris
Fallait la trouver celle-la!:lol:

Merci

Hors ligne