bash - script - Salida de comando de tubería a T pero también código de salida de comando
scripts bash ejemplos (4)
Como está ejecutando bash
, puede usar su variable $PIPESTATUS lugar de $?
:
mvn clean install $@ | tee $logfile
echo ${PIPESTATUS[0]}
Esta pregunta ya tiene una respuesta aquí:
- Salida de tubería y estado de salida de captura en Bash 15 respuestas
Tengo un script de shell en el que envuelvo un comando (mvn clean install), para redirigir el resultado a un archivo de registro.
#!/bin/bash
...
mvn clean install $@ | tee $logfile
echo $? # Does not show the return code of mvn clean install
Ahora, si la instalación de mvn clean install
falla con un error, quiero que la secuencia de comandos de shell del wrapper también falle con ese error. Pero dado que estoy canalizando toda la salida hacia el tee, no puedo acceder al código de retorno de mvn clean install
, ¿entonces cuando mvn clean install
a $?
después, siempre es 0 (desde los éxitos de tee).
Intenté dejar que el comando escribiera el resultado del error en un archivo separado y luego lo comprobé, pero el resultado de error de mvn siempre está vacío (parece que solo escribe en stdout).
¿Cómo puedo preservar el código de retorno de mvn clean install
pero aún mvn clean install
el resultado a un archivo de registro?
Podría ejecutar el comando mvn y almacenar en caché el código de salida ... Utilizo el comando "falso" para mi ejemplo.
$ { false ; echo $? > /tmp/false.status ; } | tee $logfile
$ cat /tmp/false.status
1
De esta forma, puede usar el contenido del archivo de estado para tomar más decisiones.
Tengo curiosidad ahora si hay una manera más elocuente de lograr esto.
Puede establecer la opción de opción de shell de pipefail
de línea para obtener el comportamiento que desea.
Del manual de referencia de Bash :
El estado de salida de una interconexión es el estado de salida del último comando en la
pipefail
, a menos que la opción depipefail
esté habilitada (ver Establecer interconexión ). Sipipefail
está habilitado, el estado de retorno de la tubería es el valor del último comando (más a la derecha) para salir con un estado distinto de cero, o cero si todos los comandos salen exitosamente.
Ejemplo:
$ false | tee /dev/null ; echo $?
0
$ set -o pipefail
$ false | tee /dev/null ; echo $?
1
Para restablecer la configuración original de la tubería:
$ set +o pipefail
Solución alternativa (nota: una solución perfer @ Frederic):
f=`mktemp`
(mvn clean install $@; echo $?>$f) | tee $logfile
e=`cat $f` #error in variable e
rm $f