![Redirija stdout al comando-A si tiene éxito; de lo contrario, stderr al comando-b. Evitando el uso de archivos temporales](https://rvso.com/image/164722/Redirija%20stdout%20al%20comando-A%20si%20tiene%20%C3%A9xito%3B%20de%20lo%20contrario%2C%20stderr%20al%20comando-b.%20Evitando%20el%20uso%20de%20archivos%20temporales.png)
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 if
condición y ver si el comando se ejecutó correctamente o no y aún almacenar el resultado del comando stdout
en stderr
una variable.
if ! var=$(cmd 2>&1); then
printf 'process stderr contents from $var'
fi
Puedes verlo funcionando si simulo que cmd
se 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 stdout
si la sustitución del comando es exitosa, lo que estará en la else
clá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