#1 Le 18/12/2008, à 23:52
- Totor
[Résolu] ksh - code retour d'un processus dans un pipeline
Bonsoir,
Contexte :
Dans un script ksh, j'ai une fonction qui écrit dans la sortie standard et qui renvoie un code retour. Je ne peux pas modifier cette fonction.
J'aimerai pouvoir récupérer le code retour de cette fonction tout en traçant ce qu'elle affiche dans un fichier ainsi que l'affichage écran.
De façon simpliste, j'ai voulu faire ceci :
function maFonction
{
echo TOTO
return 1
}
{ maFonction; CODE=$?; } | tee -a monFichier
echo $CODE
Mais bon, utilisant un pipeline, { maFonction; CODE=$?; } est exécutée par un processus indépendant et la variable CODE n'a qu'une portée locale à ce processus. Elle n'est donc plus valorisée après exécution du pipeline.
Une solution en vue ? car là je bloque... j'ai cherché et tenté plein de trucs avec les redirections <(, >( & Co mais sans succès.
Note : une solution sans fichier temporaire SVP !
De même, pas de pipefail car cela ne me permet pas de récupérer la sortie standard de la fonction !
Note, il m'est impossible de faire ceci (pour d'autres contraintes du reste du code) :
(
maFonction
if [ $? ... ]; then
...
fi
...
)|tee -a nomFichier
Dernière modification par Totor (Le 19/12/2008, à 12:11)
-- Lucid Lynx --
Hors ligne
#2 Le 19/12/2008, à 03:37
- thevert
Re : [Résolu] ksh - code retour d'un processus dans un pipeline
Voilà la bête :
#!/usr/bin/ksh
function maFonction
{
echo TOTO
return 1
}
{
CODE=$({ { maFonction; echo "$?" >&3 ;} | tee -a monFichier ;} 3>&1 >&4 4>&-)
} 4>&1
echo $CODE
ps: en bash il suffirait d'utiliser PIPESTATUS au lieu de $? :
#!/bin/bash
function maFonction
{
echo TOTO
return 1
}
maFonction | tee -a monFichier
echo $PIPESTATUS
#3 Le 19/12/2008, à 12:11
- Totor
Re : [Résolu] ksh - code retour d'un processus dans un pipeline
Merci beaucoup !
J'ai quelques difficultés avec le mécanisme des redirections donc je ne comprends pas trop comment ça fonctionne même si je vois le principe générale.
Je regarderai de plus près plus tard.
Merci
-- Lucid Lynx --
Hors ligne
#4 Le 20/12/2008, à 15:14
- Totor
Re : [Résolu] ksh - code retour d'un processus dans un pipeline
Hello !
Bon, j'ai tout compris ... sauf un truc :
Pourquoi fermer la sortie associée au descripteur 4 et ne pas le faire pour le 3, ce qui donnerait ?
{
CODE=$({ { maFonction; echo "$?" >&3 3>&- ;} | tee -a monFichier ;} 3>&1 >&4 4>&-)
} 4>&1
d'ailleurs, pourquoi les fermer ?
-- Lucid Lynx --
Hors ligne