Redirija stdout al comando-A si tiene éxito; de lo contrario, stderr al comando-b. Evitando el uso de archivos temporales

Redirija stdout al comando-A si tiene éxito; de lo contrario, stderr al comando-b. Evitando el uso de archivos temporales

Tengo un comando que escribe en stdout cuando está feliz y en stderr cuando no lo está. Quiero verificar el estado de salida del comando y hacer algo con stdout o stderr.

if ! command >/tmp/stdout 2>/tmp/stderr; then
  // do something with /tmp/stderr
  exit 1
fi

// do something else with /tmp/stdout

Ciertamente es posible tener un solo archivo en lugar de dos, pero me gustaría deshacerme de todos los archivos, no solo de uno.

¿Hay alguna manera de evitar los archivos temporales? Lo intenté con mkfifo y descriptores de archivos personalizados, pero no puedo hacerlo funcionar.

Respuesta1

Puede usar la $(..)sintaxis de sustitución de comandos en la ifcondición y ver si el comando se ejecutó correctamente o no y aún almacenar el resultado del comando stdouten stderruna variable.

if ! var=$(cmd 2>&1); then
    printf 'process stderr contents from $var'
fi

Puedes verlo funcionando si simulo que cmdse ejecute como un script simple que hace esto.

# cat temp.sh    
echo foo >&2
exit 1

y si ejecuto el script como

if ! var=$(bash tmp.sh 2>&1); then
    printf '%s\n' 'process stderr contents from $var'
    printf '%s\n' "$var"
fi

De la misma manera, puede hacer que funcione para la captura stdoutsi la sustitución del comando es exitosa, lo que estará en la elsecláusula del ejemplo anterior. En cualquier caso, manipular el contenido de "$var"(asegúrese de que las comillas estén activas) garantizará que esté procesando el resultado como si estuviera almacenado en un archivo.

Puede seguir adelante y citar la sintaxis de sustitución de comandos paranodeje que el shell realice la división de palabras en los resultados. Por ejemplo, haciéndolo como se muestra a continuación. Puede que no sea necesario para casos sencillos como el que he mostrado aquí, pero sí para casos en los que los resultados contienen algunos metacaracteres especiales del shell.

if ! var="$(bash tmp.sh 2>&1)"; then

Nota: El título de la pregunta se reformuló desde que se publicó la primera versión de la respuesta.

Respuesta2

puedes usar el siguiente código

if [[ $? == 0 ]]
then
command 1>stdout.txt
else
echo "exit code is not successfull"
command 2> stderr.txt
fi

información relacionada