AVERTISSEMENT : PAS (encore ?) DE FONCTIONNEMENT !
La méthode suivante semble être une piste possible pour le faire fonctionner sans créer de fichiers temporaires et aussi sur POSIX sh seulement ; elle nécessite cependant base64 et à cause de l'encodage/décodage, elle peut ne pas être très efficace et utiliser aussi une "plus grande" mémoire.
et vous verrez que, par exemple, des parties de la ligne encodée en base64 se trouvent en haut du fichier, d'autres à la fin, et le contenu non décodé du stderr au milieu.
Eh bien, même si l'idée ci-dessous ne peut pas être mise en œuvre (ce que je suppose), elle peut servir d'anti-exemple pour les personnes qui pourraient croire à tort qu'elle pourrait être mise en œuvre de cette manière.
Idée (ou anti-exemple) :
#!/bin/sh
exe()
{
echo out1
echo err1 >&2
echo out2
echo out3
echo err2 >&2
echo out4
echo err3 >&2
echo -n err4 >&2
}
r="$( { exe | base64 -w 0 ; } 2>&1 )"
echo RAW
printf '%s' "$r"
echo RAW
o="$( printf '%s' "$r" | tail -n 1 | base64 -d )"
e="$( printf '%s' "$r" | head -n -1 )"
unset r
echo
echo OUT
printf '%s' "$o"
echo OUT
echo
echo ERR
printf '%s' "$e"
echo ERR
donne (avec le correctif stderr-newline) :
$ ./ggg
RAW
err1
err2
err3
err4
b3V0MQpvdXQyCm91dDMKb3V0NAo=RAW
OUT
out1
out2
out3
out4OUT
ERR
err1
err2
err3
err4ERR
(Au moins sur dash et bash de Debian)