#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..
Connected \o/
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
Du coup, on fait confiance à Watael
Dernière modification par Hizoka (Le 14/11/2020, à 11:32)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
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 ?
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.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
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.
Connected \o/
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
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
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
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
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
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