2010-12-10 6 views
9

me gustaría enviar el resultado de una serie de comandos a una variable:estado de tuberías después de la sustitución de comandos

variable=$(a | few | commands) 

Sin embargo, la sustitución comando restablece PIPESTATUS, por lo que no puede inspeccionar en el que salió mal después del hecho. Una solución sería utilizar mktemp y poner el resultado allí temporalmente:

variable_file=$(mktemp) || exit 1 
a | few | commands > $variable_file 
exit_codes="${PIPESTATUS[*]}" 
variable=$(<$variable_file) 

¿Hay una solución más elegante?

+0

De hecho, esta es una buena pregunta. Creo que no hay mejor solución que la tuya, espero que alguien me demuestre que estoy equivocado ;-) Probablemente conozcas "set -o pipefail", pero de todos modos esto es (más o menos) ortogonal a tu pregunta. – tokland

+0

Ok, estoy intrigado porque lo hago de la misma manera que tú ... y funciona ... pero si hay algo más elegante ... déjame tenerlo ... – Cipi

+1

Ver esta [pregunta] (http://stackoverflow.com/questions/3450960/using-xargs-to-assign-stdin-to-a-variable) para obtener más ideas. Ver también [aquí] (http://stackoverflow.com/questions/2413166/bash-redirect-and-append-stdout-and-stderr-to-file-and-terminal). –

Respuesta

7

Un poco hacky, pero creo que se podría tratar así.

variable=$(a | few | commands; echo ": ${PIPESTATUS[*]}") 
PIPESTATUS=(${variable##*: }) 
variable=${variable%:*} 
variable=${variable%$'\n'} 
+0

+1, limpio siempre y cuando sepa qué esperar de los comandos. – l0b0

+0

si la salida de 'a | pocos | comandos' es necesario, ¿podría el estado enviarse a través del descriptor de archivo 3? – jozxyqk

+0

@jozxyqk La salida se captura en '$ variable' (después de mezclarse y dividirse). – ephemient

Cuestiones relacionadas