#1 Le 29/12/2020, à 09:17
- philoeil
[ABANDON] Test de redirection et remonté dans le temps
Bonjour,
Non je n'ai pas inventé la machine à remonter le temps...
Mais l'ordre d'affichage ne suit pas toujours l'ordre du script avec les redirections employées et je ne sais pas l'anticiper
Pour mieux maîtriser les résultats de mes redirections dans un script j'ai fait un script test.
Pour le tester il nécessite :
un fichier texte à déclarer en variable REP en ligne 5
Mes 2 questions :
1) Y a-t-il un point d'attention, un bug potentiel dans le traitement des 3 espaces de redirections test redirection pour READ, test redirection pour affichage editeur texte (ici vim), test redirection pour affichage SELECT
2) comment anticiper les "affichages remontant le temps" qui apparaissent
dans les lignes entourant:
"ou va cette seconde ligne"
J'obtiens :
ou va cette 1ere ligne?
ou va cette 4eme ligne?
test une seconde erreur volontaire ficBidon5
n'existe pas devrait apparaitre sur stdout et dans le journalErreur et dans journalDeveloppeur
ou va cette seconde ligne?
Le script test :
#/!bin/bash
# paramètres importés
TailleMo=0
REP="./ActionDoublons.txt" # Un fichier texte test à afficher
CheminJournalDeveloppeur="./JournalDeveloppeur"
CheminJournal="./Journal"
CheminActionDbl="."
CheminJournalErreur="./JournalErreur"
tty=$(tty)
truncate -s 0 "$CheminJournalErreur"
truncate -s 0 "$CheminJournal"
truncate -s 0 "$CheminJournalDeveloppeur"
# ----------------------- Choix du mode d'affichage verbeux=conception ou non=usage
echo "Quel mode d'affichage des messages en cours d'execution est choisi ?"
PS3="Choisir le mode d'affichage : "
select itemAff in "- Mode developpeur : Affiche tous les messages, et les paramètres " "- Mode utilisateur simple (correspond à tout ce qui est mémorisé dans le journal) : Affiche les messages essentiels MESSAGE DEBUT DE TEST et n'affiche pas le message FIN DE TEST"
do
echo -e "\fLe choix fait $REPLY:$itemAff"
if let "$REPLY" 2>/dev/null
then
echo "choix conforme"
else
echo "Entrée erronée ! variable non numérique"
fi
if [ "$REPLY" -eq 1 ]
then
# "- Afficher tous les messages"
Verbeux="True"
else
Verbeux="False"
fi
break
done
# ============================================================================================
exec 2> >(tee -a "$CheminJournalErreur" >&2) # envoi les erreurs dans CheminJournalErreur et les affiches sur stdout
# ============================================================================================
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 developpeur=verbeux VRAI choisi"
echo -e "\nToutes sorties des commandes seront affichées et envoyées\t dans le fichier JournalDeveloppeur\t \f"
echo "Pour envoyer une commande dans le journal, il faut utiliser >>"'$CheminJournal'
echo "Les erreurs sont envoyées dans "'$CheminJournalErreur'
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
echo "Mode verbeux=FAUX Affichage volontaire des 4 lignes suivantes"
echo -e "Chaque sortie des prochaines commandes ne sera pas affichée mais envoyée dans le fichier JournalDeveloppeur"
echo "Pour envoyer une commande dans le journal seulement, il faut utiliser >>"'$CheminJournal'
echo " Pour envoyer sur stdout et le fichier journal | tee -a "'$CheminJournal'
echo -e "Les erreurs sont envoyées dans stdout et "'$CheminJournalErreur'"et dans le JournalDeveloppeur\n\f"
fi # IF Verbeux
# ====================================================================================
# Test redirection Erreur FicBidon4
echo "test une erreur volontaire ficBidon4
n'existe pas devrait apparaitre sur stdout et dans le journalErreur et dans journalDeveloppeur "
ls ficbidon4
# ==============================Test redirection Paramètres======================================================
# Test redirection paramètres et messages
if [ ! "$Verbeux" == "True" ] # redirection selon mode verbeux ou non
then # redirection verbeux =FALSE
echo " A partir de la ligne suivante l'affchage stdout est coupé"
exec 5>&1 # Lie le descripteur de fichier #5 avec stdout.
exec >>"$CheminJournalDeveloppeur" # envoie stdout dans le #5 et dans le CheminJournalDeveloppeur
echo "test affichage une 1ere ligne test (ne devrait s'afficher que dans journal developpeur)"
echo " Le paramètre CheminJournal est $CheminJournal"
echo -e "\ntest envoi resultat commande ls 2020* sur #1 et dans CheminJournal\n" | tee -a "$CheminJournal"
ls 2020* | tee -a "$CheminJournal"
echo -e "\n test envoi commande ls Journal* seulement dans CheminJournal\n" >>"$CheminJournal"
ls Journal* >>"$CheminJournal"
else # redirection verbeux = TRUE
echo "test affichage une 1ere ligne test"
echo " Le paramètre CheminJournal est $CheminJournal"
echo -e "\ntest envoi resultat commande ls 2020* sur #1 et dans CheminJournal\n" | tee -a "$CheminJournal"
ls 2020* | tee -a "$CheminJournal"
echo -e "\n test envoi commande ls Journal* seulement dans CheminJournal\n" >>"$CheminJournal"
ls Journal* >>"$CheminJournal"
fi
# ===============================FIn Test redirection Paramètres=====================================================
# Test affichage VIM
if [ ! "$Verbeux" == "True" ] #<<<<<<<<<<<<<<<<<<<<<< Ferme la redirection VIM selon mode verbeux ou non
then
exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur
else
exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur
fi
vim "$REP"
if [ ! "$Verbeux" == "True" ] #<<<<<<<<<<<<<<<<<<<<<< OUVRE la redirection VIM selon mode verbeux ou non reetabli la redirection d'erreur
then
exec 5>&1 # Lie le descripteur de fichier #5 avec stdout.
# echo -e "\n====================\nFIN Test affichage VIM\n========================\n" >>"$CheminJournalDeveloppeur"
echo -e "\fou va cette 1ere ligne?\n " # seulement sur stdout
exec 1> >(tee -a "$CheminJournalDeveloppeur" >&1) # envoie stdout dans le #1 et dans le CheminJournalDeveloppeur
echo -e "\fou va cette seconde ligne?\n " # sur stdout et CheminJournalDeveloppeur
exec >>"$CheminJournalDeveloppeur" # envoie stdout dans le #5 et dans le CheminJournalDeveloppeur
echo -e "\fou va cette 3eme ligne?\n " # seulement sur CheminJournalDeveloppeur et remonte dans le temps avant seconde ligne
exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur
echo -e "\fou va cette 4eme ligne?\n " # seulement sur stdout et remonte dans le temps avant seconde ligne
?
else # 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
fi
# echo -e "\n====================\nTest seconde redirection Erreur mode verbeux faux \n========================\n" | tee -a "$CheminJournalDeveloppeur" | tee -a "$CheminJournal"
echo "test une seconde erreur volontaire ficBidon5
n'existe pas devrait apparaitre sur stdout et dans le journalErreur et dans journalDeveloppeur "
ls ficbidon5
# ====================================================================================
# Test affichage Read
exec 2>$tty # Suspend la redirection d'erreur
echo "phrase2 "
# Marche mal ==> read -p "Ecrire un mot :" reponse #le titre ne serait pas affiché au bon endroit
# marche bien => printf '%s' 'Un projet existe-t-il (ou vient dêtre créé) ? ....... (Y pour YES)'
2>&1 read -p "Phrase question v3 dans read, entrer un mot" reponse
echo -e "\nLe mot ecrit est $reponse"
if [ ! "$Verbeux" == "True" ] #<<<<<<<<<<<<<<<<<<<<<< OUVRE la redirection selon mode verbeux ou non
then
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) # Rétabli la redirection d'erreur et l'affiche 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
else
exec 2> >(tee -a "$CheminJournalErreur" >&2) # Rétabli la redirection d'erreur et l'affiche 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
#echo -e "\n====================\nTest 3eme redirection Erreur\n========================\n" | tee -a "$CheminJournal"
echo "test une 3eme erreur volontaire ficBidon6
n'existe pas va apparaitre sur stdout et dans journal et dans le journalErreur et dans journalDeveloppeur "
ls ficbidon6
#echo -e "\n====================\n FIN Test 3eme redirection Erreur\n========================\n"
# ----------------------------------------------------------- #
# ====================================================================================
# Test affichage SELECT
if [ ! "$Verbeux" == "True" ] #>>>>>>>>>>>>>>>>>>>>>>>>>>> OUVRE SELECT la redirection stdout selon mode verbeux ou non
then
exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur
echo -e "\n====================\nTest affichage SELECT\n========================\n" | tee -a "$CheminJournal" | tee -a "$CheminJournalDeveloppeur"
exec 2>$tty # Suspend la redirection d'erreur
else
echo -e "\n====================\nTest affichage SELECT\n========================\n" | tee -a "$CheminJournal"
exec 2>$tty # Suspend la redirection d'erreur
fi
select itemAct in "-Lancer choix 1" "- Lancer Choix 2 "
do
echo "Le choix fait = $REPLY"
case "$REPLY" in
1)
echo "choix1"
break
;;
2)
echo "choix2"
break
;;
*)
echo "mauvais choix"
;;
esac
echo "choix2"
done
if [ ! "$Verbeux" == "True" ] #<<<<<<<<<<<<<<<<<<<<<< ferme la redirection SELECT stdout selon mode verbeux ou non
then
exec 5>&1 # Lie le descripteur de fichier #5 avec stdout.
echo -e "\n====================\n FIN Test affichage SELECT Verbeux= FALSE\n========================\n" >>"$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 -e "\n====================\n FIN Test affichage SELECT Verbeux = TRUE\n========================\n"
exec 5>&1 # Lie le descripteur de fichier #5 avec stdout.
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
#echo -e "\n====================\nTest 4eme redirection Erreur\n========================\n" | tee -a "$CheminJournal"
echo "test une 4eme erreur volontaire ficBidon7
n'existe pas va apparaitre sur stdout et dans journal et dans le journalErreur et dans journalDeveloppeur "
ls ficbidon7
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
# ----------------------------------------------------------- #
# A partir d'ici toutes les redirections sont arrétées
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
if [ ! "$Verbeux" == "True" ] #<<<<<<<<<<<<<<<<<<<<<< Ferme la redirection selon mode verbeux ou non
then
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
exec 2>$tty # Suspend la redirection d'erreur
else
exec 1>$tty # re affiche les commande suivante sur stdout et interrompt l'envoi de stdout au journal developpeur
exec 2>$tty # Suspend la redirection d'erreur
fi
echo -e "\fA partir d'ici toutes les redirections sont arrétées"
echo -e "\f\n222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222\nAffichage fichier Developpeur:\n22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222\n "
cat "$CheminJournalDeveloppeur"
echo -e "\n----------------------------------------------------------------\nPremier Affichage du journal erreur :\n"
cat "$CheminJournalErreur"
echo -e "\n----------------------------------------------------------------\nPremier Affichage du journal :\n"
cat "$CheminJournal"
Merci pour votre aide
Dernière modification par philoeil (Le 01/01/2021, à 19:09)
Hors ligne
#2 Le 29/12/2020, à 12:00
- Watael
Re : [ABANDON] Test de redirection et remonté dans le temps
1a,c) read et select affiche leur sortie sur stderr, donc quand cette dernière est redirigée, il n'y a pas d'affichage des prompts et autres menus.
1b) je ne sais pas.
2) tu ne peux pas, les redirections foutent le bordel ·
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 29/12/2020, à 14:16
- philoeil
Re : [ABANDON] Test de redirection et remonté dans le temps
Merci Watael de ta réponse
Bonne journée
Hors ligne