scripts script resueltos programacion pasar parametros ejercicios ejemplos comandos basicos bash shell pipe sh tee

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í:

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 de pipefail esté habilitada (ver Establecer interconexión ). Si pipefail 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