No lo se ash
en 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 mktemp
para crear un archivo (s) temporal, en printf
lugar 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 PIPESTATUS
porque 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.
ash
específica (si la hay) para resolver el problema. Si escribe tal respuesta, déjeme un comentario debajo de mi respuesta.