Redirección temporal de stderr en un script bash
-
22-07-2019 - |
Pregunta
Tengo un script simple que se usa para iniciar otro programa. Este otro programa a veces puede producir un SIGSEGV
, que interrumpe mi salida. Por lo tanto, he agregado un par de líneas que se supone que redirigen temporalmente el stderr
a / dev / null
de modo que se ignore el SIGSEGV
. El siguiente es un borrador de mi código:
exec 2> /dev/null
progname >& ./tmp/run.txt && run_status='OK'
exec 2>1
El problema es que la última línea no hace lo que quiero. La primera línea obviamente funciona y redirige el stderr
. Se supone que la última línea devuelve el stderr
a donde estaba antes (que solo supuse que es lo mismo que stdout
).
¡Cualquier ayuda sería solicitada!
Solución
Otra opción es:
exec 3> /dev/stderr 2> /dev/null
progname >& ./tmp/run.txt && run_status='OK'
exec 2>&3
O incluso
exec 3>&2 2> /dev/null
progname >& ./tmp/run.txt && run_status='OK'
exec 2>&3
De esa forma, el script conserva la separación de stdout y stderr para el script (es decir, los scripts stdout y stderr se pueden redirigir por separado.
Otros consejos
¿Por qué no simplemente redirigirlo solo para el nombre del programa ejecutado?
progname > ./tmp/run.txt 2>/dev/null && run_status='OK'
O posiblemente
{
progname > ./tmp/run.txt && run_status='OK'
} 2>/dev/null