Existe-t-il un moyen simple de "rembobiner" /dev/stdin
dans mon script bash qui a déjà lu tout ou partie du tube d'entrée?rembobiner stdin dans un script bash
Application: J'ai écrit simple MDA dans la partie 1, lit un e-mail de la ligne fetchmail par ligne, comme ceci:
while read -a linA; do
echo -e "$[++linenum]:\t${#linA[@]},${linA[*]}" > /dev/null # verbose
[ "${linA[0]}" = "Date:" ] && unset linA[0] && mailDate="${linA[*]}"
[ "${linA[0]}" = "Subject:" ] && unset linA[0] && mailSubject="${linA[*]}"
[ "$mailSubject" = "Courtesy Fill Notification" ] || break # if wrong subject then thank you, we're done with this mail
done
et à la fin du traitement, je souhaite enregistrer le message entier dans un fichier, à la fois pour le débogage, et de sorte que le côté écrivain du tube voit que toute sa sortie a été lue, et ne retourne pas l'échec (donc le message n'est pas lu dans la boîte aux lettres).
++ parce que j'aime les astuces de bash dans les trois premières lignes de code. Mon script mda.sh est toujours utilisé de manière non interactive de toute façon ... même pour les tests je redirige/cat un fichier de test. – Marcos
Par curiosité, avec quel code avez-vous cherché à obtenir cette erreur 'ESPIPE'? Je peux utiliser pour les cas non-pipe. – Marcos
J'ai en fait exécuté un programme que j'ai écrit/généré appelé 'errno' qui imprime les informations correspondant à un numéro d'erreur spécifié numériquement ou sous forme de chaîne (j'ai spécifié ESPIPE).Vous l'obtiendriez si vous faites: 'int p [2], e; tuyau (p); lseek (p [0], -1L, 2); e = errno; printf ("% d (% s) \ n", e, strerror (e)); ', sauf que le nom symbolique est plus difficile à obtenir que cela. (J'ai un script Perl pour générer le code réel de 'errno'.) –