No lo se ashen absoluto. Esta solución general debería funcionar incluso en sh:
psf=/tmp/pipestatus
: > "$psf" # to make the file empty
( dd if=/my/block/device; echo "1 $?" >> "$psf" ) \
| ( ssh myuser@otherserver "gzip > file.gz"; echo "2 $?" >> "$psf" )
Luego verificas el contenido de /tmp/pipestatus. Hay una falla: condición de carrera, los dos ( )bloques se ejecutan en paralelo, pueden salir al archivo no en el orden correcto. Lo usé >>para que ninguno de los mensajes sobrescriba al otro; los "mensajes" son cortos, por lo que no se deben intercalar; numeré los "mensajes", por lo que incluso si no están en orden, puede recuperar el orden correcto más tarde ( sort, cut).
El código anterior es solo un ejemplo de todos modos. Se usa una solución más robusta mktemppara crear un archivo (s) temporal, en printflugar de echo. Para deshacerse por completo de la condición de carrera, debe escribir en archivos separados :
psd="$(mktemp -d)"
# you may want to check if the above command succeeded
( dd if=/my/block/device; printf '%s\n' "$?" > "$psd/f1" ) \
| ( ssh myuser@otherserver "gzip > file.gz"; printf '%s\n' "$?" > "$psd/f2" )
# retrieve the results here, they are in "$psd/f1" and "$psd/f2"
rm -rf "$psd"
unset psd
No es tan bueno como el de Bash PIPESTATUSporque se basa en algún sistema de archivos y la capacidad de escribir allí, pocas cosas pueden salir mal y no pueden ser atrapadas. Aún mejor que nada.
ashespecífica (si la hay) para resolver el problema. Si escribe tal respuesta, déjeme un comentario debajo de mi respuesta.