#1 Le 17/02/2023, à 10:46
- Tawal
[Résolu] [Bash] Redirection totale vers log, canaux 1 et 2 gardés.
Hello,
J'ai un script qui renvoie des retours sur la sortie standard et sur la sortie d'erreurs.
J'aimerais loguer toutes les sorties (normales et erreurs) dans un log,
tout en gardant intact les canaux 1 et 2 du terminal.
C'est à dire pouvoir faire :
./script.sh 2>/dev/null
et donc ne voir que la sortie standard sur le terminal mais avoir toutes les sorties (erreurs comprises) dans un log.
Comment m'y prendre ?
Je sens que la solution est assez simple, mais je n'y arrive pas.
J'ai une "demi"-solution qui utilise la commande tee mais je perds la différenciation des canaux 1 et 2 au niveau du terminal.
Merci de votre aide.
Dernière modification par Tawal (Le 17/02/2023, à 11:14)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#2 Le 17/02/2023, à 10:50
- sputnick
Re : [Résolu] [Bash] Redirection totale vers log, canaux 1 et 2 gardés.
Dans ton script, si c'est en bash, tu peut mettre:
exec &> >(tee /tmp/log)
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#3 Le 17/02/2023, à 10:56
- Tawal
Re : [Résolu] [Bash] Redirection totale vers log, canaux 1 et 2 gardés.
Merci sputnick.
J'étais en train de faire des tests avec ce genre de commande (similaire à la tienne) :
exec 1> >(tee -a log) 2> >(tee -a log)
Évidemment, directement dans le terminal, cette commande est une horreur.
Mais elle fonctionne à partir d'un script.
Ta commande est équivalente à la mienne mais elle est plus concise
Edit:
L'option -a (--append) est là pour cumuler les retours dans le log des différentes exécutions du script.
Dernière modification par Tawal (Le 17/02/2023, à 10:59)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#4 Le 17/02/2023, à 11:13
- Tawal
Re : [Résolu] [Bash] Redirection totale vers log, canaux 1 et 2 gardés.
Après plusieurs tests, je peux mettre ce sujet en résolu.
Et je garde la formulation de sputnick.
Je l'ai intégré de cette façon dans mon script :
if [ "$log" ]
then
exec &> >(tee -a "$log")
fi
Merci encore.
Je me doutais que ce n'était pas si compliqué
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#5 Le 17/02/2023, à 12:43
- sputnick
Re : [Résolu] [Bash] Redirection totale vers log, canaux 1 et 2 gardés.
Si je peux me permettre: le test du log n'est pas nécessaire et devrait être écrit
[[ -e $log ]]
Le code va créer le fichier tout seul grâce à la redirection. Il suffit d'être qur que le répertoire de log existe bien.
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#6 Le 17/02/2023, à 14:56
- Watael
Re : [Résolu] [Bash] Redirection totale vers log, canaux 1 et 2 gardés.
là, tu testes que le fichier existe. Tawal veut vérifier que la variable est définie.
ce serait d'ailleurs, pour être clair, test -n "$log" && exec...
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 17/02/2023, à 15:29
- sputnick
Re : [Résolu] [Bash] Redirection totale vers log, canaux 1 et 2 gardés.
En bash, on utilise
[[ ... ]]
:
`[[` is a bash keyword similar to (but more powerful than) the `[` command. See <http://mywiki.wooledge.org/BashFAQ/031> and <http://mywiki.wooledge.org/BashGuide/Te … nditionals>. Unless you're writing for POSIX sh, I recommend `[[`
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#8 Le 17/02/2023, à 15:36
- Watael
Re : [Résolu] [Bash] Redirection totale vers log, canaux 1 et 2 gardés.
je préfère utiliser test qui dit bien ce qu'il fait, et j'encourage son emploi avec if <commande>; then....fi.
je n'utilise les crochets doubles que lorsque j'ai besoin de leurs fonctionnalités.
mais n'hésite pas à me tancer si tu me vois utiliser les crochets simples.
Dernière modification par Watael (Le 17/02/2023, à 15:37)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 17/02/2023, à 17:47
- sputnick
Re : [Résolu] [Bash] Redirection totale vers log, canaux 1 et 2 gardés.
Le
[[ ]]
a bien des avantages. Par exemple, pas besoin de "quoter" les variables à l'intérieur, cela est plus naturel.
La commande
test
est un built-in, mais c'est pour les shell POSIX. En bash, autant ne pas se priver de la puissance des doubles crochets... Voir liens (en Anglais).
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#10 Le 17/02/2023, à 18:26
- Watael
Re : [Résolu] [Bash] Redirection totale vers log, canaux 1 et 2 gardés.
mais puisque je ne me sers pas de la toute-puissance des crochets doubles, pourquoi je les utiliserais ?
je n'ai pas besoin d'une moissonneuse pour me tailler un ticket de métro ! et pourquoi pas un SUV en ville !?
Dernière modification par Watael (Le 17/02/2023, à 18:28)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#11 Le 17/02/2023, à 18:46
- sputnick
Re : [Résolu] [Bash] Redirection totale vers log, canaux 1 et 2 gardés.
Si tu utilise le #shebang# bash, tu décide implicitement d'utiliser ses ressources, dont le '[[ ]]'
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#12 Le 17/02/2023, à 20:49
- Watael
Re : [Résolu] [Bash] Redirection totale vers log, canaux 1 et 2 gardés.
quand j'en ai besoin.
je n 'épluche pas un oignon avec un couteau de chef, et
je n'émince pas ce même oignon avec un couteau d'office.
je peux en faire des tartines : couteau à beurre, couteau à pain.
Dernière modification par Watael (Le 17/02/2023, à 21:02)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne