¿Cómo verificar los estados de retorno de los comandos canalizados en Ash Shell?

0

¿Cómo verificar los códigos de retorno para los procesos canalizados entre sí en el caparazón de cenizas?

Aquí está el comando que me interesa:

dd if=/my/block/device | ssh myuser@otherserver "gzip > file.gz" 

Además, sé que esto ha sido respondido para bash shell (es decir, usando la matriz PIPESTATUS), pero mi entorno utiliza ash shell.

hebbo
fuente

Respuestas:

1

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.

Kamil Maciorowski
fuente
Nota: votaré cualquier respuesta mejor que la mía; en particular, una respuesta que utiliza la forma correctaash específica (si la hay) para resolver el problema. Si escribe tal respuesta, déjeme un comentario debajo de mi respuesta.
Kamil Maciorowski