#1 Le 11/10/2021, à 19: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, à 20:51)
Hors ligne
#2 Le 11/10/2021, à 22: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, à 06: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, à 08: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 COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#5 Le 12/10/2021, à 08: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, à 08:11)
Hors ligne
#6 Le 12/10/2021, à 10:57
- credenhill
Re : [RESOLU] recherche solution redirection dans une boucle While
hello
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 ?
En ligne
#7 Le 12/10/2021, à 12:34
- philoeil
Re : [RESOLU] recherche solution redirection dans une boucle While
Bonjour,
Merci Iznobe
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.
il ne faut pas en abuser,
pourquoi cette remarque ?
Hors ligne
#8 Le 12/10/2021, à 14: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, à 14: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, à 14:59
- kamaris
Re : [RESOLU] recherche solution redirection dans une boucle While
Pour le premier point, ton ordi a mal fait le copier-coller
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, à 19: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, à 20: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, à 20:50
- philoeil
Re : [RESOLU] recherche solution redirection dans une boucle While
Bonjour,
Champion ! Kamaris
Fallait la trouver celle-la!:lol:
Merci
Hors ligne