Bonjour à tous.

Depuis quelques jours, je me pose une question existencielle à laquelle je n'ai pas encore obtenue de réponse.

En fait que désirerais écrire une fonction dont les attributs pourraient être à la fois passés en paramètre ou bien consommé via un pipe.
Un petit exemple vaut bien souvent de long discours :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
# exemple avec passage de paramètre
maFonction "unAttribut" "unAutreAttribut"
 
# exemple avec pipe :
echo "unAttribut unAutreAttribut"|maFonction
Pour résoudre ce problème voici comment j'ai procédé à l'interieur de ma fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
function maFonction {
   if [[ "$#" != "0" ]] ; then
      mesAttributs=$*
   else
      mesAttributs=$(cat)
   fi
   echo "mesAttributs=${mesAttributs}"
}
# Exemples d'utilisation qui fonctionnent
maFontion att1 att2
echo "att1 att2"|maFonction
Le problème avec cette méthode se situe lors de l'utilisation du pipe. Si la commande avant pipe ne sort rien, alors le cat situé dans la fonction se bloque en attendant indéfiniment que quelque chose arrive :
uneCommande|maFonction
Si une uneCommande n'envoit rien en sortie, cela bloque.

Mes questions :
- Ma méthode pour réaliser une telle fonction est-elle bonne ? En existe-t-il d'autre(s) ?
- Y aurait-il quelque chose d'alternatif au cat qui par exemple planterait ($? != 0) si aucun flux n'arrive ? Dans tel cas, je pourrait traiter le cas d'un flux vide à l'intérieur de la fonction.

Sinon j'ai contourné le problème en imposant l'utilisation de passage de paramètre. On peut donc dire que mon problème est fonctionnellement résolu. Mais cette question me "turlupine" depuis quelques jours, et comme je n'aime pas rester sans réponse, je fais appel à vous "o grands maîtres du développement shell"