#1 Le 01/01/2021, à 19:24
- philoeil
[RESOLU] Recherche cause pour correction d'1 erreur sur redirections
Bonjour,
Pouvez-vous m'aider à corriger mon script
J'ai reproduit l'erreur dans un script test ci-dessous
L'erreur que je cherche à corriger :
./TRedirProgr3.sh : ligne 208 : 7000 Complété attend
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"
attend()
{
printf ", une touche pour interrompre.
"
exec 2>$tty # Suspend la redirection d'erreur
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)
while : ;do
for i in {0..15} # for do 10
do # for do 10
if [ $i -eq 15 ]
then
echo -en "\r-------------------------------\r"
else
echo -ne " ."
sleep 0.1
fi
done # for do 10
done
}
progress()
{
printf "Attente une touche + ENTREE ."
attend & PROGR_PID=$!
while [[ -z ${repon} ]] # While do done repon
do # While do done repon
read -t 1 repon
done # While do done repo
unset repon
kill $PROGR_PID
}
IndirectProgress()
{
progress
}
# ----------------------- 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 "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 -e "Les erreurs sont envoyées dans stdout et "'$CheminJournalErreur'"et dans le JournalDeveloppeur\n\f"
fi # IF Verbeux
# ==============================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=====================================================
exec 2>$tty # Suspend la redirection d'erreur
exec 1>$tty
exec 1>&5 5>&- # Restaure stdout et ferme le descripteur de fichier #
exec 1> >(tee -a "$CheminJournalDeveloppeur" >&1) # envoie stdout dans le #1 et dans le CheminJournalDeveloppeur
while [[ -z "$FichierProjet" ]] # While FicProj
do # While FicProj
2>&1 read -p "--- quel fichier traiter, donner son nom (peut-être Projet$CRD ?)" FichierProjet
CheminProjet="./$FichierProjet"
touch "$CheminProjet"
echo "votre reponse : $FichierProjet"
echo "le chemin du projet : $CheminProjet" | tee -a "$CheminJournal"
if [ -f $CheminProjet ] # if test CheminProjetExiste
then
echo "Le fichier projet existe"
else
echo "Le fichier projet n'existe pas reessayer..."
unset FichierProjet
fi
done # While FicProj
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====================\nFIN Test affichage WHILE\n========================\n" >>"$CheminJournalDeveloppeur"
# ====================================================================================
# 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
echo "Lancement direct de Progress sans passage par ExportParametres ne provoque pas l'erreur "
progress
echo "Lancement de progress dans fonction IndirectProgress Provoque l'erreur "
IndirectProgress
Merci à tous avec mes meilleurs voeux...
Dernière modification par philoeil (Le 02/01/2021, à 10:12)
Hors ligne
#2 Le 02/01/2021, à 01:20
- kamaris
Re : [RESOLU] Recherche cause pour correction d'1 erreur sur redirections
Il n'y a « que » 199 lignes dans le script, donc l'erreur que tu cites ligne 208 ne semble pas correspondre.
Par ailleurs, pourrais-tu donner un bout de code plus court, en localisant un peu plus l'erreur ?
Meilleurs vœux également
Hors ligne
#3 Le 02/01/2021, à 01:36
- Watael
Re : [RESOLU] Recherche cause pour correction d'1 erreur sur redirections
Complété attend
semble normal lorsque attend est interrompu.
reste à savoir d'où vient le 7000, et pourquoi le shell interprète le script comme ayant plus de lignes que le compte réel...
une telle différence apparaît parfois quand un guillemet ou un heredoc n'est pas fermé.
entre les \r et les redirections, difficile de dire quelle est le contenu original du message d'erreur.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 02/01/2021, à 10:06
- philoeil
Re : [RESOLU] Recherche cause pour correction d'1 erreur sur redirections
Bonjour,
Merci Watael
Je n'étais pas famillier avec les processus et je viens de comprendre que ce n'étais pas une erreur mais l'affichage du PID
Merci Kamaris
Le nombre de ligne qui a changé entre ma copie du message et le script est du à ma correction lors de la relecture du message
J'ai bêtement enlevé des lignes de commentaire qui me semblaient inutiles mais qui vous ont posé problème pour la compréhension de ma question
Je ne le ferai plus
et je m'étais planté sur des renvois de redirection qui affichaient dans le JournalErreur les messages PID
Pour la peine le script test modifié
#!/bin/bash
# paramètres importés
CheminJournalDeveloppeur="./JournalDeveloppeur"
CheminJournal="./Journal"
CheminActionDbl="."
CheminJournalErreur="./JournalErreur"
tty=$(tty)
truncate -s 0 "$CheminJournalErreur"
truncate -s 0 "$CheminJournal"
truncate -s 0 "$CheminJournalDeveloppeur"
attend()
{
printf ", une touche pour interrompre.
"
exec 2>$tty # Suspend la redirection d'erreur
#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)
while : ;do
for i in {0..15} # for do 10
do # for do 10
if [ $i -eq 15 ]
then
echo -en "\r-------------------------------\r"
else
echo -ne " ."
sleep 0.1
fi
done # for do 10
done
if [ ! "$Verbeux" == "True" ] #<<<<<<<<<<<<<<<<<<<<<< OUVRE la redirection selon mode verbeux ou non
then
exec 5>&1 # Lie le descripteur de fichier #5 avec stdout.
exec 1> >(tee -a "$CheminJournalDeveloppeur" >&1) # envoie stdout dans le #1 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
}
progress()
{
printf "Attente une touche + ENTREE ."
attend & PROGR_PID=$!
exec 2>$tty # Suspend la redirection d'erreur
# 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)
while [[ -z ${repon} ]] # While do done repon
do # While do done repon
read -t 1 repon
done # While do done repo
if [ ! "$Verbeux" == "True" ] #<<<<<<<<<<<<<<<<<<<<<< OUVRE la redirection selon mode verbeux ou non
then
exec 5>&1 # Lie le descripteur de fichier #5 avec stdout.
exec 1> >(tee -a "$CheminJournalDeveloppeur" >&1) # envoie stdout dans le #1 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
unset repon
kill $PROGR_PID
}
IndirectProgress()
{
exec 2>$tty # Suspend la redirection d'erreur
progress
}
# ----------------------- 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 "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 -e "Les erreurs sont envoyées dans stdout et "'$CheminJournalErreur'"et dans le JournalDeveloppeur\n\f"
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
fi # IF Verbeux
# ===============================FIn Test redirection Paramètres=====================================================
exec 2>$tty # Suspend la redirection d'erreur
exec 1>$tty
# exec 1>&5 5>&- # Restaure stdout et ferme le descripteur de fichier #
exec 1> >(tee -a "$CheminJournalDeveloppeur" >&1) # envoie stdout dans le #1 et dans le CheminJournalDeveloppeur
while [[ -z "$FichierProjet" ]] # While FicProj
do # While FicProj
2>&1 read -p "--- quel fichier traiter, donner son nom (peut-être Projet$CRD ?)" FichierProjet
CheminProjet="./$FichierProjet"
touch "$CheminProjet"
echo "votre reponse : $FichierProjet"
echo "le chemin du projet : $CheminProjet" | tee -a "$CheminJournal"
if [ -f $CheminProjet ] # if test CheminProjetExiste
then
echo "Le fichier projet existe"
else
echo "Le fichier projet n'existe pas reessayer..."
unset FichierProjet
fi
done # While FicProj
#echo -e "\n====================\nFIN Test affichage WHILE\n========================\n" >>"$CheminJournalDeveloppeur"
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
# ====================================================================================
# 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
echo " Le premier Lancement direct de Progress sans passage par ExportParametres n'affiche pas cette ligne ni de message PID "
progress
echo "Lancement de progress dans fonction IndirectProgress Provoque l'affichage message PID si lancé en second "
IndirectProgress
echo " Second Lancement direct de Progress sans passage par ExportParametres affiche le message "
progress
echo "SECOND Lancement de progress dans fonction IndirectProgress affiche le message "
IndirectProgress
Le script affiché sur stdout
./TRedirProgr6.sh
Quel mode d'affichage des messages en cours d'execution est choisi ?
1) - Mode developpeur : Affiche tous les messages, et les paramètres
2) - 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
Choisir le mode d'affichage : 2
Le choix fait 2:- 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
choix conforme
Les erreurs sont envoyées dans stdout et $CheminJournalErreuret dans le JournalDeveloppeur
--- quel fichier traiter, donner son nom (peut-être Projet ?)Projet
votre reponse : Projet
le chemin du projet : ./Projet
Le fichier projet existe
ls: impossible d'accéder à 'ficbidon4': Aucun fichier ou dossier de ce type
. .---------------------------
.Lancement de progress dans fonction IndirectProgress Provoque l'affichage message PID si lancé en second
Attente une touche + ENTREE ., une touche pour interrompre.
. . . .d . .
./TRedirProgr6.sh : ligne 72 : 26216 Complété attend
Second Lancement direct de Progress sans passage par ExportParametres affiche le message
Attente une touche + ENTREE ., une touche pour interrompre.
. . . . .d .
./TRedirProgr6.sh : ligne 72 : 26245 Complété attend
.SECOND Lancement de progress dans fonction IndirectProgress affiche le message
Attente une touche + ENTREE ., une touche pour interrompre.
. . . .d .
./TRedirProgr6.sh : ligne 72 : 26261 Complété attend
La sortie du JournalErreur conforme à mes attentes :
ls: impossible d'accéder à 'ficbidon4': Aucun fichier ou dossier de ce type
Hors ligne