Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

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 14/11/2020, à 10:36

philoeil

[RESOLU] Redirection sur ecran et fichier erreur en echec

Bonjour,

Je ne parviens pas à rediriger un affichage d'une erreur d'une commande vers le fichier erreur + l'ecran

Mon test

#!/bin/bash
DateJ=$(date +%Y%m%d)
HeureJ=$(date +%H%M)

# Envoyer les erreurs dans Fichier journal erreurs
JournalErreur="$DateJ-JournalErreur"
truncate -s 0 "$JournalErreur"

echo "-------------------------------------"
echo
touch bidon
echo "1er test sans erreur > Test OK"
ls "bidon" 2>>"$JournalErreur"  
echo "second test avec erreur envoyée dans fichier erreur seulement > Test Ok"
ls "bidon2" 2>>"$JournalErreur"  
echo "troisieme test avec erreur dans fichier et affichage erreur sur ecran Test=> ECHECS"
#ls "bidon3" 2>&1  
# Affiche le message d'erreur mais n'écrit pas dans le fichier
ls "bidon3" 2>&1 >>"$JournalErreur" 1>&2 
ls "bidon4" 2>&1 2>>"$JournalErreur" 1>&2 

ls "bidon5" >>"$JournalErreur" 1>&2 
ls "bidon6" >>"$JournalErreur" 2>&1 
ls "bidon7" 1>&2 2>>"$JournalErreur"  
ls "bidon9" >>"$JournalErreur"  
echo "
ci-dessous le fichier Journal des erreurs :"
cat "$JournalErreur"

Les resultats :

$ ./T2InfoRedir.sh 
-------------------------------------

1er test sans erreur > Test OK
bidon
second test avec erreur envoyée dans fichier erreur seulement > Test Ok
troisieme test avec erreur dans fichier et affichage erreur sur ecran Test=> ECHECS
ls: impossible d'accéder à 'bidon3': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'bidon5': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'bidon9': Aucun fichier ou dossier de ce type

ci-dessous le fichier Journal des erreurs :
ls: impossible d'accéder à 'bidon2': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'bidon4': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'bidon6': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'bidon7': Aucun fichier ou dossier de ce type

Merci pour votre aide

Dernière modification par philoeil (Le 15/11/2020, à 08:32)

Hors ligne

#2 Le 14/11/2020, à 11:05

Watael

Re : [RESOLU] Redirection sur ecran et fichier erreur en echec

salut,

un peu de stfw :

cmd 2> >(tee -a "$erreurs")

il y a un petit souci d'ordre d'affichage..


Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 14/11/2020, à 11:12

Hizoka

Re : [RESOLU] Redirection sur ecran et fichier erreur en echec

Salut :

ls popo 2>&1 >/dev/null | tee -a retours
=> ls: impossible d'accéder à 'popo': Aucun fichier ou dossier de ce type

cat retours
=> ls: impossible d'accéder à 'popo': Aucun fichier ou dossier de ce type

EDIT : Oups, ma solution te bloque le retour normal du coup tongue
Du coup, on fait confiance à Watael smile

Dernière modification par Hizoka (Le 14/11/2020, à 11:32)

Hors ligne

#4 Le 14/11/2020, à 12:28

philoeil

Re : [RESOLU] Redirection sur ecran et fichier erreur en echec

Bonjour,

Merci Watael et Hizoka
Que veut dire ?

Watael a écrit :

un peu de stfw :

Le test fonctionne avec tee -a
J'essaie de comprendre les possibilités des redirections, j'ai l'impression qu'une autre solution existe

Est-il possible de passer par une autre redirection que tee -a ?

Peut-on envoyer 1 vers un autre decripteur 3? 2 vers descripteur 3? et afficher 3? dans ecran et envoyer 2 vers fichiererreur ?

je n'ai pas trouvé comment faire

#!/bin/bash
DateJ=$(date +%Y%m%d)
HeureJ=$(date +%H%M)

# Envoyer les erreurs dans Fichier journal erreurs
JournalErreur="$DateJ-JournalErreur"
truncate -s 0 "$JournalErreur"
echo "-------------------------------------"
echo
touch bidon
echo "1er test sans erreur > Test OK"
ls "bidon" 2>>"$JournalErreur"  
echo "second test avec erreur envoyée dans fichier erreur seulement > Test Ok"
ls "bidon2" 2>>"$JournalErreur"  
echo "troisieme test avec erreur dans fichier et affichage erreur sur ecran Test=> ECHECS"
#ls "bidon3" 2>&1  
# Affiche le message d'erreur mais n'écrit pas dans le fichier
ls "bidon3" 2>&1 >>"$JournalErreur" 1>&2 | tee -a "$JournalErreur"
ls "bidon10" 2>&1 >>"$JournalErreur" | tee -a "$JournalErreur"

# test de ce qu'il ne faut pas faire
#ls "bidon4" 2>&1 2>>"$JournalErreur" 1>&2 | tee -a "$JournalErreur"
 

#ls "bidon5" >>"$JournalErreur" 1>&2 | tee -a "$JournalErreur"

#ls "bidon6" >>"$JournalErreur" 2>&1 | tee -a "$JournalErreur"

#ls "bidon7" 1>&2 2>>"$JournalErreur" | tee -a "$JournalErreur"

echo "
ci-dessous le fichier Journal des erreurs :"
cat "$JournalErreur"

Dernière modification par philoeil (Le 14/11/2020, à 12:28)

Hors ligne

#5 Le 14/11/2020, à 12:38

Hizoka

Re : [RESOLU] Redirection sur ecran et fichier erreur en echec

Peut-on envoyer 1 vers un autre decripteur 3? 2 vers descripteur 3? et afficher 3? dans ecran et envoyer 2 vers fichiererreur ?

Si tu envoies le 2 vers le 3, comment veux tu envoyer par la suite le 2 vers un fichier ?
C'est justement le rôle de tee que d'envoyer les données vers un fichier sans bloquer le process.

Hors ligne

#6 Le 14/11/2020, à 14:22

philoeil

Re : [RESOLU] Redirection sur ecran et fichier erreur en echec

Bonjour,

J'ai trouvé cet exercice qui m'intéresse et semble expliquer ce que je cherche mais je ne parviens pas à l'appliquer.
ici
ABS

#! /usr/bin/env bash


mkfifo /tmp/fifo1 /tmp/fifo2
while read a; do echo "FIFO1: $a"; done < /tmp/fifo1 & exec 7> /tmp/fifo1
exec 8> >(while read a; do echo "FD8: $a, to fd7"; done >&7)

exec 3>&1
(
 (
  (
   while read a; do echo "FIFO2: $a"; done < /tmp/fifo2 | tee /dev/stderr | \
        tee /dev/fd/4 | tee /dev/fd/5 | tee /dev/fd/6 >&7 &
   exec 3> /tmp/fifo2

   echo 1st, to stdout
   sleep 1
   echo 2nd, to stderr >&2
   sleep 1
   echo 3rd, to fd 3 >&3
   sleep 1
   echo 4th, to fd 4 >&4
   sleep 1
   echo 5th, to fd 5 >&5
   sleep 1
   echo 6th, through a pipe | sed 's/.*/PIPE: &, to fd 5/' >&5
   sleep 1
   echo 7th, to fd 6 >&6
   sleep 1
   echo 8th, to fd 7 >&7
   sleep 1
   echo 9th, to fd 8 >&8

  ) 4>&1 >&3 3>&- | while read a; do echo "FD4: $a"; done 1>&3 5>&- 6>&-
 ) 5>&1 >&3 | while read a; do echo "FD5: $a"; done 1>&3 6>&-
) 6>&1 >&3 | while read a; do echo "FD6: $a"; done 3>&-

rm -f /tmp/fifo1 /tmp/fifo2


# Pour chaque commande et sous-shell, cherchez vers quoi est lié chaque fd.
# Bonne chance.

exit 0

Quelqu'un sait expliquer le bon usage d'exec avec les FD?
Pour une solution alternative à tee

Merci

Hors ligne

#7 Le 14/11/2020, à 15:24

Watael

Re : [RESOLU] Redirection sur ecran et fichier erreur en echec

c'est très compliqué à des fins d'exercice, et très loin du principe KISS.
tu observeras que ça utilise aussi tee.

je dois avouer que je ne suis pas à l'aise avec les redirections de cet ordre.


Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 14/11/2020, à 18:16

Hizoka

Re : [RESOLU] Redirection sur ecran et fichier erreur en echec

Oh ! C'est extrêmement rare un sujet bash qui met "à mal" Watael smile

Hors ligne

#9 Le 14/11/2020, à 20:33

kamaris

Re : [RESOLU] Redirection sur ecran et fichier erreur en echec

Je n'ai pas l'impression que tu puisses couper à l'utilisation de tee (ou autre commande, externe en tout cas) pour réellement dupliquer un flux.
Les exec avec les descripteurs, à eux seuls, ne me semblent pas pouvoir faire ça.

Par exemple, pour afficher le résultat d'une commande tout en passant ce résultat à une autre commande via un pipe, j'utilise cette petite fonction :

print_and_pass() { tee >(1>&2 cat); }

qui s'utilise comme suit :

command_1 | print_and_pass | command_2

Je ne sais pas comment faire ça sans tee.

Dernière modification par kamaris (Le 14/11/2020, à 20:36)

Hors ligne

#10 Le 14/11/2020, à 20:57

Hizoka

Re : [RESOLU] Redirection sur ecran et fichier erreur en echec

Intéressant cette commande, merci Kamaris smile

Hors ligne

#11 Le 14/11/2020, à 21:33

kamaris

Re : [RESOLU] Redirection sur ecran et fichier erreur en echec

Oui, ça permet de filtrer « en live » la sortie d'une commande, et de faire des choses en fonction de ce qui s'y trouve, tout en préservant son affichage naturel, et donc sans recourir à un stockage temporaire dans une variable ou un fichier.
Par contre, en complément, il faut souvent recourir à la commande script ou autre astuce du même genre, pour préserver cet affichage naturel justement, en faisant croire à la commande qu'elle écrit dans un terminal et pas dans un pipe.

Hors ligne

#12 Le 14/11/2020, à 21:39

philoeil

Re : [RESOLU] Redirection sur ecran et fichier erreur en echec

Bonjour,

Merci à tous et Merci Kamaris pour la fonction et les infos

Je clos le débat et passe en resolu

Hors ligne

#13 Le 14/11/2020, à 22:53

philoeil

Re : [RESOLU] Redirection sur ecran et fichier erreur en echec

Bonjour,
J'y reviens tout ne marche pas comme je voudrai, je reviens à l'essentiel de ma question initiale
Objectif envoyer la commande si ok dans JournalOK si Erreur dans Journal Erreur et dans tous les cas afficher aussi à l'écran

Mon script test (3e et 4e parties fonctionnent presque mais ne répondent pas vraiment tout à fait à l'objectif, parties 1 et 2 bon pour la poubelle je laisse juste pour montrer mes difficultés)

#!/bin/bash
DateJ=$(date +%Y%m%d)
HeureJ=$(date +%H%M)
print_and_pass() { tee >(1>&2 cat); }
# Envoyer les erreurs dans Fichier journal erreurs
JournalErreur="$DateJ-JournalErreur"
JournalOK="$DateJ-JournalOK"

truncate -s 0 "$JournalErreur"
truncate -s 0 "$JournalOK"
echo "-------------------------------------"
echo
touch bidon
touch bidon12
touch bidon13
 
   echo "1er test Objectif :  afficher bidon et l'envoyer dans JournalOK "
   ls "bidon" 1>>$JournalOk | print_and_pass | tee -a "$JournalOk" | 2>>"$JournalErreur" | tee -a "$JournalErreur" 
ls "bidon" | print_and_pass | sed 's/^/Erreur : /' >&2
echo "
second test avec erreur bidon2 : objectif envoyer dans JournalErreur  "
ls "bidon2" 1>>$JournalOk 2>>"$JournalErreur" | tee -a "$JournalErreur" 
ls "bidon2" | print_and_pass | sed 's/^/Erreur : /' >&2


echo "
troisieme test avec substitution en debut par message "Erreur :" objectif  bidon11 envoyé dans JournalErreur et bidon12 envoyé dans JournalOK"
ls "bidon11" 1>>$JournalOK 2>>$JournalErreur 2> >(sed 's/^/Erreur : /' >&2) | tee -a $JournalErreur
ls "bidon12" 1>>$JournalOK 2>>$JournalErreur 2> >(sed 's/^/Erreur : /' >&2) | tee -a $JournalErreur
 
echo "
4e test  objectif bidon14 envoyé dans JournalErreur"
echo " bidon13 envoyé dans JournalOK"
ls "bidon13" 2>&1 2>>$JournalErreur 1>&2 | tee -a $JournalErreur
ls "bidon14" 2>&1 2>>$JournalErreur 1>&2 | tee -a $JournalErreur


   echo "

   Affichage des resultats :"
   echo  "
   JournalErreur : $JournalErreur"
   cat "$JournalErreur"
 echo  "
 JournalOK : $JournalOK"
   cat "$JournalOK"

LE retour du script

$ ./QFT4Redir.sh 
-------------------------------------

1er test Objectif :  afficher bidon et l'envoyer dans JournalOK 
./QFT4Redir.sh: ligne 18: $JournalOk : redirection ambiguë
tee: '': Aucun fichier ou dossier de ce type
Erreur : bidon
bidon

second test avec erreur bidon2 : objectif envoyer dans JournalErreur  
./QFT4Redir.sh: ligne 22: $JournalOk : redirection ambiguë
ls: impossible d'accéder à 'bidon2': Aucun fichier ou dossier de ce type

troisieme test avec substitution en debut par message Erreur : objectif  bidon11 envoyé dans JournalErreur et bidon12 envoyé dans JournalOK

4e test  objectif bidon14 envoyé dans JournalErreur
 bidon13 envoyé dans JournalOK


   Affichage des resultats :

   JournalErreur : 20201114-JournalErreur
Erreur : ls: impossible d'accéder à 'bidon11': Aucun fichier ou dossier de ce type
bidon13
ls: impossible d'accéder à 'bidon14': Aucun fichier ou dossier de ce type

 JournalOK : 20201114-JournalOK
bidon12

Merci de votre aide

Hors ligne

#14 Le 14/11/2020, à 23:27

kamaris

Re : [RESOLU] Redirection sur ecran et fichier erreur en echec

Tu peux faire ça (faux : voir ci-dessous en #17) :

command 1> >(tee out) 2> >(1>&2 tee err)

pour avoir la sortie standard dans out et l'erreur dans err, tout en ayant l'ensemble qui s'affiche à l'écran (et en préservant les bons descripteurs de fichiers).

Dernière modification par kamaris (Le 15/11/2020, à 00:13)

Hors ligne

#15 Le 14/11/2020, à 23:41

philoeil

Re : [RESOLU] Redirection sur ecran et fichier erreur en echec

Merci Kamaris

Presque bon, ai-je fais une erreur

#!/bin/bash
DateJ=$(date +%Y%m%d)
HeureJ=$(date +%H%M)
print_and_pass() { tee >(1>&2 cat); }
# Envoyer les erreurs dans Fichier journal erreurs
JournalErreur="$DateJ-JournalErreur"
JournalOK="$DateJ-JournalOK"

truncate -s 0 "$JournalErreur"
truncate -s 0 "$JournalOK"
echo "-------------------------------------"
echo
touch bidon

ls "bidon2" 1> >(tee "$JournalOK") 2> >(1>&2 tee "$JournalErreur") 
ls "bidon" 1> >(tee "$JournalOK") 2> >(1>&2 tee "$JournalErreur") 

echo " Affichage des resultats :"
   echo  "
   JournalErreur : $JournalErreur"
   cat "$JournalErreur"
 echo  "
 JournalOK : $JournalOK"
   cat "$JournalOK"

Resultat script :

$ ./T4DoubleRedirection.sh 
-------------------------------------

ls: impossible d'accéder à 'bidon2': Aucun fichier ou dossier de ce type
 Affichage des resultats :

   JournalErreur : 20201114-JournalErreur
bidon

 JournalOK : 20201114-JournalOK
bidon

Merci

Hors ligne

#16 Le 14/11/2020, à 23:49

philoeil

Re : [RESOLU] Redirection sur ecran et fichier erreur en echec

Bonjour,

Je crois que c'est bon
Petite correction

ls "bidon2" 1> >(tee -a "$JournalOK") 2> >(1>&2 tee -a "$JournalErreur") 
ls "bidon" 1> >(tee -a "$JournalOK") 2> >(1>&2 tee -a "$JournalErreur") 

Hors ligne

#17 Le 15/11/2020, à 00:01

kamaris

Re : [RESOLU] Redirection sur ecran et fichier erreur en echec

Non, je t'ai dit une bêtise, en fait ça préserve mal les descripteurs, il peut y avoir des chevauchements.
Comme ça, ça devrait être mieux :

command 2> >(1>&2 tee err) | tee out

Et tu peux rajouter -a pour ne pas écraser les fichiers à chaque fois si tu veux.

J'avoue ne pas bien saisir la subtilité qui différencie ce que j'ai proposé en #15 et en #17.
À priori, on pourrait penser que cmd 1> >(tee out) et cmd | tee out sont équivalents, mais non.
Il y a une sorte d'hermétisme avec le pipe que l'on n'a pas avec les substitutions de processus : c'est comme ça big_smile

Dernière modification par kamaris (Le 15/11/2020, à 00:16)

Hors ligne

#18 Le 15/11/2020, à 00:30

philoeil

Re : [RESOLU] Redirection sur ecran et fichier erreur en echec

Bonjour,

Merci Kamaris, je ne vois pas de chevauchement, cela marche dan les 2 scripts
Je me demandais si je pouvais rajouter un message Erreur en debut d'envoi de l'erreur avec sed j'ai essayé mais je perd la sortie sur le fichier JournalErreur

#!/bin/bash
DateJ=$(date +%Y%m%d)
HeureJ=$(date +%H%M)
print_and_pass() { tee >(1>&2 cat); }
# Envoyer les erreurs dans Fichier journal erreurs
JournalErreur="$DateJ-JournalErreur"
JournalOK="$DateJ-JournalOK"

truncate -s 0 "$JournalErreur"
truncate -s 0 "$JournalOK"
echo "-------------------------------------"
echo
touch bidon
touch bidon3
touch bidon6
touch bidon7

ls "bidon2" 1> >(tee -a "$JournalOK") 2> >(1>&2 tee -a "$JournalErreur") 
ls "bidon" 1> >(tee -a "$JournalOK") 2> >(1>&2 tee -a "$JournalErreur") 

ls "bidon5" 2> >(1>&2 tee -a "$JournalErreur") | tee -a "$JournalOK" 
ls "bidon6" 2> >(1>&2 tee -a "$JournalErreur") | tee -a "$JournalOK" 

ls "bidon3" 1> >(tee -a "$JournalOK") 2> >(1>&2 sed 's/^/Erreur : /' >&2 | tee -a "$JournalErreur") 
ls "bidon4" 1> >(tee -a "$JournalOK") 2> >(1>&2 sed 's/^/Erreur : /' >&2 | tee -a "$JournalErreur") 


ls "bidon7" 2> >(1>&2 sed 's/^/Erreur : /' >&2 | tee -a "$JournalErreur") | tee -a "$JournalOK" 
ls "bidon8" 1> >(1>&2 sed 's/^/Erreur : /' >&2 | tee -a "$JournalErreur") | tee -a "$JournalOK" 

echo " Affichage des resultats :"
   echo  "
   JournalErreur : $JournalErreur"
   cat "$JournalErreur"
 echo  "
 JournalOK : $JournalOK"
   cat "$JournalOK"

Resultat du script

$ ./T4DoubleRedirection.sh 
-------------------------------------

ls: impossible d'accéder à 'bidon2': Aucun fichier ou dossier de ce type
bidon
ls: impossible d'accéder à 'bidon5': Aucun fichier ou dossier de ce type
bidon6
bidon3
Erreur : ls: impossible d'accéder à 'bidon4': Aucun fichier ou dossier de ce type
bidon7
ls: impossible d'accéder à 'bidon8': Aucun fichier ou dossier de ce type
 Affichage des resultats :

   JournalErreur : 20201115-JournalErreur
ls: impossible d'accéder à 'bidon2': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'bidon5': Aucun fichier ou dossier de ce type

 JournalOK : 20201115-JournalOK
bidon
bidon6
bidon3
bidon7

Hors ligne

#19 Le 15/11/2020, à 00:39

kamaris

Re : [RESOLU] Redirection sur ecran et fichier erreur en echec

Méfie-toi, il y a bien des chevauchements possibles avec ce que j'ai donné en #15 : si tu exécutes plusieurs fois la commande, ça finira par arriver (il y a un aspect aléatoire, dû au fait que les substituions de processus sont exécutées en parallèle).
Pour ajouter un préfixe à l'erreur, tu peux faire :

command 2> >(sed 's/^/Erreur : /' | 1>&2 tee err) | tee out

Hors ligne

#20 Le 15/11/2020, à 08:31

philoeil

Re : [RESOLU] Redirection sur ecran et fichier erreur en echec

Bravo bravo et merci Kamaris:)
C'est RESOLU

Pour les néophites de passage le code corrigé qui fonctionne

#!/bin/bash
DateJ=$(date +%Y%m%d)
HeureJ=$(date +%H%M)
print_and_pass() { tee >(1>&2 cat); }
# Envoyer les erreurs dans Fichier journal erreurs
JournalErreur="$DateJ-JournalErreur"
JournalOK="$DateJ-JournalOK"

truncate -s 0 "$JournalErreur"
truncate -s 0 "$JournalOK"
echo "-------------------------------------"
echo
touch bidon6
touch bidon7


ls "bidon5" 2> >(1>&2 tee -a "$JournalErreur") | tee -a "$JournalOK" 
ls "bidon6" 2> >(1>&2 tee -a "$JournalErreur") | tee -a "$JournalOK" 


ls "bidon7" 2> >(sed 's/^/Erreur : /' | 1>&2 tee -a "$JournalErreur") | tee -a "$JournalOK" 
ls "bidon8" 2> >(sed 's/^/Erreur : /' | 1>&2 tee -a "$JournalErreur") | tee -a "$JournalOK" 

echo "
===============================================================================================
Affichage des resultats :"
   echo  "
   JournalErreur : $JournalErreur"
   cat "$JournalErreur"
 echo  "
 JournalOK : $JournalOK"
   cat "$JournalOK"

Le resultat :

$ ./T5DoubleRedirection.sh 
-------------------------------------

ls: impossible d'accéder à 'bidon5': Aucun fichier ou dossier de ce type
bidon6
bidon7
Erreur : ls: impossible d'accéder à 'bidon8': Aucun fichier ou dossier de ce type

===============================================================================================
Affichage des resultats :

   JournalErreur : 20201115-JournalErreur
ls: impossible d'accéder à 'bidon5': Aucun fichier ou dossier de ce type
Erreur : ls: impossible d'accéder à 'bidon8': Aucun fichier ou dossier de ce type

 JournalOK : 20201115-JournalOK
bidon6
bidon7

Hors ligne