#1 Le 13/10/2021, à 22:17
- philoeil
[RESOLU] Redirection recherche solution dans appel fonction Menu
Bonjour,
C'est dans la continuité de mon problème précédent :
Forum question redirection boucle while
J'aimerai pouvoir envoyer dans le journalDeveloppeur les traces des choix faits par l'utilisateur (en mode verbeux true ou false)
Mon problème est que la solution précédente, ici ne marche pas
Dans la fonction MenuGeneral2 si je fais
done | my_logger
la variable devient $REPLY=0
et le retour de mon traitement select case ne prend plus en compte mon choix
Ma question : Comment faire la redirection et conserver la valeur de $REPLY ?
Le script test :
#!/bin/bash
# parametre forcé en local pour le test
CheminActionDbl="./"
my_logger ()
{
if [[ "$Verbeux" == "true" ]]; then
tee -a "$CheminJournalDeveloppeur"
else
cat >>"$CheminJournalDeveloppeur"
fi
}
FermeRedirectionS()
{
# A lancer aprs boucle select, while et read ...
if [[ ! "$Verbeux" == "true" ]] # <<<<<<<<<<<<<<<<<<<<<< ferme la redirection SELECT stdout selon mode verbeux ou non
then # verbeux=false
echo "(info : FermeRedirectionS cas Verbeux=$Verbeux)"
exec 5>&1 # Lie le descripteur de fichier #5 avec stdout.
exec >>"$CheminJournalDeveloppeur" # envoie stdout dans le #5 et dans le CheminJournalDeveloppeur
exec 2> >(tee -a "$CheminJournalErreur" >&2) # envoi les erreurs et les affiches sur stdout
exec 2> >(tee -a "$CheminJournalDeveloppeur" >&2) # envoi les erreurs et les affichent Dans journal developpeur
exec 2> >(tee -a "$CheminJournal" >&2) # envoi les erreurs dans #2 et chemin journal
sleep 0.01 # bricolage pour laisser le temps = petit temps d'attente avant de commencer à écrire directement sur la sortie standard, pour que la précédente écriture dans tee soit purgée :
else # verbeux=true
echo "(info : FermeRedirectionS cas Verbeux=$Verbeux)"
exec 5>&1 # Lie le descripteur de fichier #5 avec stdout.
# A1 10/10/2021 ajout de cette ligne pour automatiser l'envoi des infos dans JournalDeveloppeur en mode verbuex = true
exec 1> >(tee -a "$CheminJournalDeveloppeur" >&1) # envoie stdout dans le #1 et dans le CheminJournalDeveloppeur
exec 2> >(tee -a "$CheminJournalErreur" >&2) # envoi les erreurs et les affiches sur stdout
exec 2> >(tee -a "$CheminJournal" >&2) # envoi les erreurs dans #2 et chemin journal
exec 2> >(tee -a "$CheminJournalDeveloppeur" >&2) # envoi les erreurs et les affichent Dans journal developpeur
sleep 0.01 # bricolage pour laisser le temps = petit temps d'attente avant de commencer à écrire directement sur la sortie standard, pour que la précédente écriture dans tee soit purgée :
fi
}
MenuGeneral2()
{
echo -e "\n ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n Menu general :\n" | tee -a "$CheminJournal"
exec 2>$tty # Suspend la redirection d'erreur indispensable avant boucle select
exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur (Commun mode Verbeux ou pas)
PS3="Choisir l'action (A) : "
select itemAct2 in "- NON DISPONIBLE Choix Lancer Acton1 " "- NON DISPONIBLE Choix lancer action2 " "- Choix Construction Action3" "- Choix (re)Construire Action 4" "- Menu Action5" "- Recherche Action 6" "- Fin du script"
do
exec 2>>"$CheminJournalErreur" # Rétabli la redirection d'erreur
echo -e "\fLe choix fait Le $DateJ à $HeureJ $REPLY:$itemAct2" | tee -a "$CheminJournal"
# pour tester la variable de type entier :
if let "$REPLY" 2>/dev/null
then
echo "choix conforme (c'est un nombre) "
if [[ "$REPLY" -ge 3 ]]
then
echo " choix conforme : $REPLY"
# A2 190921 inutil ? FermeRedirectionS
return
else
echo "choix au-delà des limites possibles
Votre choix ? :"
unset itemAct2
fi
else
echo "Entrée erronée ! variable non numérique
Votre choix ? :"
unset itemAct2
fi
done
# done | my_logger passerait à zero la valeur de $REPLY
}
# Parametres en local
DateJ=$(date +%Y%m%d)
HeureJ=$(date +%H%M)
# Apres appel fonction FermeRedirectionS affichage sur stdout seulement en mode verbeux des lignes qui suivent
# et si redirection forcée | tee -a "$CheminJournal" alors affichage dans JournalSauvegarde + JournalDeveloppeur
CheminJournalErreur="./JournalErreur_TestJournalRedir"
CheminJournal="./Journal_TestJournalRedir"
CheminJournalDeveloppeur="./JournalDeveloppeur_TestJournalRedir"
truncate -s 0 "$CheminJournalErreur"
truncate -s 0 "$CheminJournalDeveloppeur"
truncate -s 0 "$CheminJournal"
read -p "choisir le mode d'affichage (Y pour Verbeux) :" reponse2
if [[ "$reponse2" == "Y" ]] # If repon2
then # If repon2
echo " La reponse était Y (mode verbeux choisi)"
Verbeux=true
# inutile ?
# declare -i Verbeux=true
else
echo " mode non verbeux choisi"
Verbeux=false
# inutile ?
# declare -i Verbeux=false
fi
echo "Verbeux=$Verbeux"
echo "Début des Redirections selon mode verbeux ou pas, à partir d'ici tous les affichages son redirigés selon le mode choisi "
tty=$(tty) # passe stdout dans une variable
echo -e "\n DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\n Journal Developpeur\n" > "$CheminJournalDeveloppeur"
echo -e "\n EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n Journal Erreur\n" > "$CheminJournalErreur"
echo -e "\n JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ\n Journal \n" > "$CheminJournal"
# ===============================Début des Redirections selon mode verbeux ou pas===========================================================================
FermeRedirectionS
if [ "$Verbeux" == "true" ] # IF Verbeux
then # IF Verbeux Mode Verbeux TRUE
echo -e "\n mode Verbeux=$Verbeux choisi (true attendu)"
echo -e "\nToute sortie des commandes sera envoyée\t dans le fichier JournalDeveloppeur\t et affichée sur stdout\net les erreurs s'affiche dans stdout, Journal, JournalDeveloppeur\f"
else
echo -e "\n mode Verbeux=$Verbeux choisi (false attendu)"
echo -e "\nToute sortie des commandes s'affiche dans journal Developpeur uniquement (pas sur stdout)"
echo -e "Seuls Les erreurs sont envoyées dans stdout et "'$CheminJournalErreur'"et dans le JournalDeveloppeur\n\f"
fi
exec 2>$tty # Suspend la redirection d'erreur
exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur (Commun mode Verbeux ou pas)
echo -e "\nSi appel d'une fonction read, select, while.... nécessité de suspendre les redirections Erreur et réafficher tous les messages sur STDOUT \net de les rétablir après avec la fonction FermeRedirectionS (dans ce mode rien n'est envoyé dans JournalDeveloppeur : sauf si emploi d'une redirection explicite)"
echo -e "s'il est souhaité dans ce mode (redirections suspendues) d'envoyer des informations vers les journaux, faire les renvois classiques :" | tee -a "$CheminJournal"
echo "Ainsi pour journal uniquement : >>\$CheminJournal" >> "$CheminJournal"
echo "Ainsi pour journal et STDOUT : | tee -a \$CheminJournal" | tee -a "$CheminJournal"
FermeRedirectionS # Ferme l'affichage sur stdout en activant les redirections prédéfinies
#Mode je n'affiche que dans cas Verbeux =TRUE
if [ ! "$Verbeux" == "true" ] #<<<<<<<<<<<<<<<<<<<<<< ferme la redirection stdout selon mode verbeux ou non AFFICHAGE TEXTE SEULEMENT SI VERBEUX=TRUE
then # Verbeux=false
echo -e "\n\nAprès appel de la fonction FermeRedirectionS,\t Cette ligne ne peut être affichée sur STDOUT (en mode Verbeux=false) elle est affichée dans CheminDeveloppeur et CheminJournal\f" | tee -a "$CheminJournal"
echo -e "\n\nAprès appel de la fonction FermeRedirectionS\t Cette ligne est envoyée dans CheminDeveloppeur uniquement\f"
echo -e "\n\n Après appel de la fonction FermeRedirectionS\t Cette ligne est envoyée uniquement dans CheminJournal \f" >>"$CheminJournal"
else # Verbeux=true
echo -e "\n\nAprès appel de la fonction FermeRedirectionS,\t Cette ligne est envoyée (sur stdout en mode Verbeux=Vrai) et dans CheminDeveloppeur et CheminJournal\f" | tee -a "$CheminJournal"
echo -e "\n\nAprès appel de la fonction FermeRedirectionS\t Cette ligne est envoyée dans CheminDeveloppeur uniquement\f" >>"$CheminJournalDeveloppeur"
echo -e "\n\n Après appel de la fonction FermeRedirectionS\t Cette ligne est envoyée uniquement dans CheminJournal\f" >>"$CheminJournal"
fi
echo -n "Fichier traces : ne s'affiche que dans journal developpeur en mode Verbeux Faux "
date
echo "-------------------------------------"
echo
echo "une erreur volontaire ligne suivante, s'affiche dans journal erreur et stdout et journalDeveloppeur"
ls "fichierQuiNExistepas"
# ----------------------------------------------------------- #
# Debut tentative C ________________________________________________________________________________________________________________________________________
# Boucle parcours des D_CPC
# les echo ne s'affiche que dans journal developpeur en mode Verbeux Faux "
echo "Test 2 boucles imbriquées avec 1 appel de fonction"
# appel menu general
REPLY=0 # nécessaire pour ne pas partir sur réponse précédente
exec 2>$tty # Suspend la redirection d'erreur
exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur (Commun mode Verbeux ou pas)
until [ "$REPLY" -eq 7 ]
do
MenuGeneral2
echo "le retour de REPLY = $REPLY"
# echo "Le choix fait $REPLY:$itemAct2"
case "$REPLY" in
1)
echo "choix 1 lancé"
;;
2)
echo "choix 2 lancé"
;;
3)
echo "choix 3 lancé"
;;
4)
echo "choix 4 lancé"
;;
5)
echo "choix 5 lancé"
;;
6)
echo "choix 6 lancé"
;;
7)
echo "Fin...." | tee -a "$CheminJournal"
;;
*)
echo "Choix incorrect "
;;
esac
done | my_logger
Dernière modification par philoeil (Le 14/10/2021, à 20:25)
Hors ligne
#2 Le 14/10/2021, à 07:23
- kamaris
Re : [RESOLU] Redirection recherche solution dans appel fonction Menu
C'est parce que le pipe lance le select dans un sous-processus, avec un environnement distinct de celui du script (initialisé comme une copie de celui du script, mais il n'y a pas de communication dans l'autre sens).
Pour éviter cela, tu peux utiliser une substitution de processus au lieu d'un pipe :
done > >(my_logger)
Ainsi my_logger est exécuté dans un sous-processus, mais pas le select.
Hors ligne
#3 Le 14/10/2021, à 20:24
- philoeil
Re : [RESOLU] Redirection recherche solution dans appel fonction Menu
Bonjour,
Merci Kamaris
Ta solution est parfaite
et tes explications toujours les bienvenue
Je désespère de faire le tour des mutiples possibilités de redirections en tout genre...:rolleyes:
Merci encore
Hors ligne