#1 Le 22/10/2021, à 12:15
- philoeil
[RESOLU]Redirection sur read problème d'affichage
Bonjour,
C'est dans la continuité de mes 2 messages précédent ici : https://forum.ubuntu-fr.org/viewtopic.php?id=2067543
L'objet est d'avoir dans 2 modes d'executions (verbeux : j'affche tout sur stdout et nonVerbeux : Je n'affiche que les informations essentielles)
un affichage des commandes et informations sur
stdout, (afficher selon le choix Verbeux)
journal (afficher que les informations essentielles)
JournalErreur (afficher que les erreurs)
et JournalDeveloppeur (afficher tout)
Pour le code test suivant reproduisant mon erreur je n'arrive pas à traiter correctement la redirection
dans la partie commande read en mode NON VERBEUX:
en mode NON VERBEUX: Cette ligne affiche le résultat correctement dans Journal Developeur mais pas dans stdout
2>&1 read -p " -Confirmer l'utilisation du nom >>>$NomActionDoublonsTxt<<<....... (Y pour Yes)" reponse
en mode NON VERBEUX: Cette ligne s'affiche correctement dans stdout mais pas dans journal developpeur
read -p " -Confirmer l'utilisation du nom >>>$NomActionDoublonsTxt<<<....... (Y pour Yes)" reponse
Le code test complet :
#!/bin/bash
# parametre forcé en local pour le test
CheminActionDbl="./"
my_logger ()
{
if [[ "$Verbeux" == "true" ]]; then
tee -a "$CheminJournalDeveloppeur"
else
cat >>"$CheminJournalDeveloppeur"
fi
}
FermeRedirectionS()
{
# A lancer aprs boucle select, while et read ...
if [[ ! "$Verbeux" == "true" ]] # <<<<<<<<<<<<<<<<<<<<<< ferme la redirection SELECT stdout selon mode verbeux ou non
then # verbeux=false
echo "(info : FermeRedirectionS cas Verbeux=$Verbeux)"
exec 5>&1 # Lie le descripteur de fichier #5 avec stdout.
exec >>"$CheminJournalDeveloppeur" # envoie stdout dans le #5 et dans le CheminJournalDeveloppeur
exec 2> >(tee -a "$CheminJournalErreur" >&2) # envoi les erreurs et les affiches sur stdout
exec 2> >(tee -a "$CheminJournalDeveloppeur" >&2) # envoi les erreurs et les affichent Dans journal developpeur
exec 2> >(tee -a "$CheminJournal" >&2) # envoi les erreurs dans #2 et chemin journal
sleep 0.01 # bricolage pour laisser le temps = petit temps d'attente avant de commencer à écrire directement sur la sortie standard, pour que la précédente écriture dans tee soit purgée :
else # verbeux=true
echo "(info : FermeRedirectionS cas Verbeux=$Verbeux)"
exec 5>&1 # Lie le descripteur de fichier #5 avec stdout.
# A1 10/10/2021 ajout de cette ligne pour automatiser l'envoi des infos dans JournalDeveloppeur en mode verbuex = true
exec 1> >(tee -a "$CheminJournalDeveloppeur" >&1) # envoie stdout dans le #1 et dans le CheminJournalDeveloppeur
exec 2> >(tee -a "$CheminJournalErreur" >&2) # envoi les erreurs et les affiches sur stdout
exec 2> >(tee -a "$CheminJournal" >&2) # envoi les erreurs dans #2 et chemin journal
exec 2> >(tee -a "$CheminJournalDeveloppeur" >&2) # envoi les erreurs et les affichent Dans journal developpeur
sleep 0.01 # bricolage pour laisser le temps = petit temps d'attente avant de commencer à écrire directement sur la sortie standard, pour que la précédente écriture dans tee soit purgée :
fi
}
# Parametres en local
DateJ=$(date +%Y%m%d)
HeureJ=$(date +%H%M)
# Apres appel fonction FermeRedirectionS affichage sur stdout seulement en mode verbeux des lignes qui suivent
# et si redirection forcée | tee -a "$CheminJournal" alors affichage dans JournalSauvegarde + JournalDeveloppeur
CheminJournalErreur="./JournalErreur_TestJournalRedir"
CheminJournal="./Journal_TestJournalRedir"
CheminJournalDeveloppeur="./JournalDeveloppeur_TestJournalRedir"
truncate -s 0 "$CheminJournalErreur"
truncate -s 0 "$CheminJournalDeveloppeur"
truncate -s 0 "$CheminJournal"
read -p "choisir le mode d'affichage (Y pour Verbeux) :" reponse2
if [[ "$reponse2" == "Y" ]] # If repon2
then # If repon2
echo " La reponse était Y (mode verbeux choisi)"
Verbeux=true
# inutile ?
# declare -i Verbeux=true
else
echo " mode non verbeux choisi"
Verbeux=false
# inutile ?
# declare -i Verbeux=false
fi
echo "Verbeux=$Verbeux"
echo "Début des Redirections selon mode verbeux ou pas, à partir d'ici tous les affichages son redirigés selon le mode choisi "
tty=$(tty) # passe stdout dans une variable
echo -e "\n DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\n Journal Developpeur\n" > "$CheminJournalDeveloppeur"
echo -e "\n EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n Journal Erreur\n" > "$CheminJournalErreur"
echo -e "\n JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ\n Journal \n" > "$CheminJournal"
# ===============================Début des Redirections selon mode verbeux ou pas===========================================================================
FermeRedirectionS
if [ "$Verbeux" == "true" ] # IF Verbeux
then # IF Verbeux Mode Verbeux TRUE
echo -e "\n mode Verbeux=$Verbeux choisi (true attendu)"
echo -e "\nToute sortie des commandes sera envoyée\t dans le fichier JournalDeveloppeur\t et affichée sur stdout\net les erreurs s'affiche dans stdout, Journal, JournalDeveloppeur\f"
else
echo -e "\n mode Verbeux=$Verbeux choisi (false attendu)"
echo -e "\nToute sortie des commandes s'affiche dans journal Developpeur uniquement (pas sur stdout)"
echo -e "Seuls Les erreurs sont envoyées dans stdout et "'$CheminJournalErreur'"et dans le JournalDeveloppeur\n\f"
fi
echo -n "Fichier traces : ne s'affiche que dans journal developpeur en mode Verbeux Faux "
date
echo "-------------------------------------"
echo
echo "une erreur volontaire ligne suivante, s'affiche dans journal erreur et stdout et journalDeveloppeur"
ls "fichierQuiNExistepas"
# ----------------------------------------------------------- #
# ________________________________________________________________________________________________________________________________________
exec 2>$tty # Suspend la redirection d'erreur
exec 1>$tty # re affiche les commandes suivantes sur stdout et interrompt l'envoi de stdout au journal developpeur (Commun mode Verbeux ou pas)
echo "Verbeux=$Verbeux"
exec 3<"$CheminActionDbl/MIR_CPCent.txt"
while IFS=$'\n' read -u3 D_CPC # While Boucle parcours des D_CPC
do # While Boucle parcours des D_CPC
# <<<<<<<<<<<<<<<<
echo -e "\n\\\\\\\\\\\\Envoyé au journal Developpeur et stdout mais PAS Journal\\\\\nJe suis dans le D_CPC\n $D_CPC\n"
done | my_logger
exec 3<&-
FermeRedirectionS
# _____________________________________Modif en cours ___________________________________________________________________________________________________
# test affichege dans bocle read
if [ ! "$Verbeux" == "true" ] # >>>>>>>>>>>>>>>>>>>>>>>>>>> OUVRE la redirection stdout selon mode verbeux ou non Affiche texte suivant dans les 2 cas
then
exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur
echo -e "\n--------------------------------------------------------------------------------------\n Je controle la présence des répertoires et fichiers nécessaires pour construire la liste des doublons à éliminer nom de cette liste : ActionDoublons.txt \n----------------------------------------------------------------------------------------\n" | tee -a "$CheminJournal" | tee -a "$CheminJournalDeveloppeur"
FermeRedirectionS # Penser à lancer fonction FermeRedirection si non plus de passage des commandes dans le JournalDeveloppeur
else
echo -e "\n--------------------------------------------------------------------------------------\n Je controle la présence des répertoires et fichiers nécessaires pour construire la liste des doublons à éliminer nom de cette liste : ActionDoublons.txt \n----------------------------------------------------------------------------------------\n" | tee -a "$CheminJournal"
fi
# exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur (Commun mode Verbeux ou pas)
NomActionDoublonsTxt="ActionDoublons.txt"
exec 2>$tty # Suspend la redirection d'erreur pour ne pas avoir les questions reponses de read dans le journal erreur
exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur (Commun mode Verbeux ou pas)
until [[ "$reponse" == "Y" ]] # untilReponse
do # WhileReponse
2>&1 read -p " -Confirmer l'utilisation du nom >>>$NomActionDoublonsTxt<<<....... (Y pour Yes)" reponse # Cette ligne s'afficherait correctement dans Journal Developeur mais pas dans stdout
# read -p " -Confirmer l'utilisation du nom >>>$NomActionDoublonsTxt<<<....... (Y pour Yes)" reponse # Cette ligne s'afficherait correctement dans stdout mais pas dans journal developpeur
echo " reponse : $reponse" | tee -a "$CheminJournal"
if [[ $reponse == "Y" ]] # If RepNomActionDoublons
then # If RepNomActionDoublons
echo " La reponse était Y "
else # If RepNomActionDoublons
echo "la reponse a été négative" | tee -a "$CheminJournal"
read -p " donner le nom au fichier à utiliser comme liste des doublons :" NomActionDoublonsTxt
fi # If RepNomActionDoublons
done > >(my_logger)
FermeRedirectionS # pour rétablir la redirection d'erreur
echo "une autre erreur volontaire ligne suivante, s'affiche dans journal erreur et stdout et journalDeveloppeur"
ls "2eme_fichierQuiNExistepas"
# _____________________________________ FIN Modif en cours ___________________________________________________________________________________________________
# Mode je n'affiche que dans cas Verbeux =TRUE
if [ ! "$Verbeux" == "true" ] #<<<<<<<<<<<<<<<<<<<<<< ferme la redirection stdout selon mode verbeux ou non AFFICHAGE TEXTE SEULEMENT SI VERBEUX=TRUE
then # Verbeux=false
echo -e "\n====================\n FIN Test redirection cette ligne n'apparait que dans Journal Developpeur, et pas dans stdout) mode verbeux false ($Verbeux) \n========================\n"
else # Verbeux=true
exec 1> $tty # Lie le descripteur de fichier #5 avec stdout Affiche tout sur stdout (Verbeux=true).
echo -e "\n====================\n FIN Test redirection Mode Verbeux= VRAI ($Verbeux) (n'apparait pas dans journal Developpeur) \n========================\n"
echo -e "\n====================\n FIN Test redirection cette ligne n'apparait que dans Journal Developpeur) \n========================\n" >>"$CheminJournalDeveloppeur"
echo -e "\n Affichage des journaux (et cette ligne apparait sur stdout (et pas dans JournalDeveloppeur) en mode verbeux=true $Verbeux)"
fi
exec 1>&5 5>&- # Restaure stdout et ferme le descripteur de fichier #
exec 1>$tty # re affiche les commandes suivantes sur stdout et interrompt l'envoi de stdout au journal developpeur (Commun mode Verbeux ou pas)
cat "$CheminJournalErreur"
cat "$CheminJournal"
cat "$CheminJournalDeveloppeur"
Merci pour votre attention
Dernière modification par philoeil (Le 22/10/2021, à 18:46)
Hors ligne
#2 Le 22/10/2021, à 15:16
- kamaris
Re : [RESOLU]Redirection sur read problème d'affichage
Il faut que tu préserves la séparation stderr / stdout (donc pas de 2>&1), mais que tu t'occupes des deux en sortie de la boucle until où se trouve le read en question.
Car là tu ne gères que stdout par
done > >(my_logger)
En reprenant ce qui est fait dans FermeRedirectionS, il faudrait quelque chose comme
done > >(my_logger) 2> >(tee -a "$CheminJournalDeveloppeur" >&2)
Hors ligne
#3 Le 22/10/2021, à 18:45
- philoeil
Re : [RESOLU]Redirection sur read problème d'affichage
Bonjour,
C'est top!,
Merci et encore bravo pour cette expertise parfaite sur les redirections.
Je suis un peu confus de ne pas arriver à maîtriser encore ces redirections,
J'essaie tout de même de comprendre. Je progresse petit à petit ....
J'ai encore du boulot!
Hors ligne
#4 Le 22/10/2021, à 19:14
- kamaris
Re : [RESOLU]Redirection sur read problème d'affichage
L'essentiel est de progresser, de toutes façons on n'a jamais tout compris
Au passage, concernant la petite fonction FermeRedirectionS, je pense qu'elle gagnerait à être réécrite comme ça :
FermeRedirectionS()
{
# A lancer aprs boucle select, while et read ...
exec 5>&1 # Lie le descripteur de fichier #5 avec stdout.
exec 2> >(tee -a "$CheminJournalErreur" "$CheminJournalDeveloppeur" "$CheminJournal" >&2) # envoie les erreurs dans les journaux et les affiche sur stderr
if [[ ! "$Verbeux" == "true" ]] # <<<<<<<<<<<<<<<<<<<<<< ferme la redirection SELECT stdout selon mode verbeux ou non
then # verbeux=false
echo "(info : FermeRedirectionS cas Verbeux=$Verbeux)"
exec >>"$CheminJournalDeveloppeur" # envoie stdout dans le CheminJournalDeveloppeur
else # verbeux=true
echo "(info : FermeRedirectionS cas Verbeux=$Verbeux)"
# A1 10/10/2021 ajout de cette ligne pour automatiser l'envoi des infos dans JournalDeveloppeur en mode verbuex = true
exec 1> >(tee -a "$CheminJournalDeveloppeur" >&1) # envoie stdout dans le #1 et dans le CheminJournalDeveloppeur
fi
sleep 0.01 # bricolage pour laisser le temps = petit temps d'attente avant de commencer à écrire directement sur la sortie standard, pour que la précédente écriture dans tee soit purgée :
}
C'est un peu plus clair (seules les parties qui dépendent du mode verbeux sont dans le if…else), et c'est probablement mieux comme ça pour le tee sur stderr.
Hors ligne
#5 Le 26/10/2021, à 21:04
- philoeil
Re : [RESOLU]Redirection sur read problème d'affichage
Bonjour,
Merci bien Kamaris,
Effectivement c'est plus optimal, je prends
(désolé pour la réponse tardive je m'étais absenté)
Hors ligne