Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile

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 wink

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