J'ai peu de fonctions définies de cette façon:
function f {
read and process $1
...
echo $result
}
Je veux les composer ensemble pour que l'invocation ressemble f | g | h
.
Quel idiome dois-je utiliser pour convertir une fonction travaillant sur des arguments en un seul argument de lecture de stdin? Est-il possible de lire des paires, des tuples d'arguments à partir d'un flux sans avoir besoin de les échapper (par exemple, terminaison nulle)?
bash
shell-script
pipe
Rumca
la source
la source
h(g(f(...)))
soit chacune des fonctions lit à partir de l'entrée standard (read x; ...
) et écrit sur la sortie standard (echo ...
).Réponses:
Une approche potentielle serait de mettre une
while...read
construction à l'intérieur de vos fonctions qui traiterait toutes les données entrées dans la fonction via STDIN, les exploiterait, puis émettrait les données résultantes via STDOUT.Il faudra faire attention à la façon dont vous configurez vos
while ..read..
composants, car ils dépendront fortement des types de données qu'ils pourront consommer de manière fiable. Il peut y avoir une configuration optimale que vous pouvez trouver.Exemple
Voici chaque fonction seule.
Les voici quand nous les utilisons ensemble.
Ils peuvent accepter différents styles d'entrée.
la source
En complément à la réponse de slm , j'ai fait quelques expériences avec des tuples séparés par des null comme arguments de fonction:
Remarques:
sayTuple
lit deux fois un enregistrement terminé par un nul-d $'\0'
gérant tout espace entourant l'entréeIFS=
.echo
dossiers de retour entourés de-
Le résultat montre qu'il gère correctement les entrées à terminaison nulle contenant
\n
et\t
:Veuillez ajouter des suggestions d'amélioration dans les commentaires, c'est un sujet intéressant.
la source
sayTuple() { arr=() ; while IFS= read -r -d $'\0' arg; do arr+="$arg"; done; echo "sayTuple: ${arr[@]}"; }
.IFS= read -r -d $'\0' -a arg
mais je n'ai pas réussi à le faire fonctionner. Cela permettrait de supprimer lewhile
, ce qui semble inutile, mais c'était le seul modèle que je pouvais obtenir.