La variable bash captura stderr y stdout por separado o obtiene el valor de salida
variables capture (2)
¿Qué versión de bash
estás usando? La captura de la salida no tiene efecto en el código de retorno con mi versión, 4.1.5
:
pax> false; echo $?
1
pax> echo $?
0
pax> x=$(false 2>&1) ; echo $?
1
No siempre es una buena idea confiar en que el error estándar no esté vacío para detectar errores. Muchos programas no generan errores, sino que dependen únicamente del código de retorno.
Esta pregunta ya tiene una respuesta aquí:
- Captura stdout y stderr en diferentes variables 13 respuestas
Necesito capturar la salida y el error de un comando en mi script de bash y saber si el comando tuvo éxito o no.
En este momento, estoy capturando a ambos de esta manera:
output=$(mycommand 2>&1)
Entonces necesito verificar el valor de salida de mycommand. Si falló, necesito hacer algunas cosas con la salida, si el comando tuvo éxito, no necesito tocar la salida.
¿Desde que estoy capturando la salida, comprobando $? siempre es un 0 desde que bash logró capturar la salida en la variable.
Este es un script muy sensible al tiempo, por lo que estamos tratando de evitar soluciones más lentas, como generar un archivo y volver a leerlo.
Si pudiera capturar stdout a una variable y stderr a otra, eso resolvería mi problema porque solo podría verificar si la variable de error estaba vacía o no.
Gracias.
El problema solo parece manifestarse cuando la salida se captura en una variable local dentro de una función:
$ echo $BASH_VERSION
3.2.48(1)-release
$ false; echo $?
1
$ echo $?
0
$ x=$(false 2>&1) ; echo $?
1
$ function f {
> local x=$(false 2>&1) ; echo $?
> }
$ f
0
$ function g {
> x=$(false 2>&1) ; echo $?
> }
$ g
1
Tenga en cuenta que solo la función f, que captura x en un local, puede expresar el comportamiento. En particular, funciona la función g que hace lo mismo, pero sin la palabra clave ''local''.
Por lo tanto, no se puede usar una variable local, y tal vez "desarmarla" después de usarla.
EDIT NVRAM señala que la declaración local se puede hacer de antemano para evitar el problema:
$ function h {
> local x
> x=$(false 2>&1) ; echo $?
> }
$ h
1