Tengo un script de shell con set -x
una salida detallada / de depuración:
#!/bin/bash
set -x
command1
command2
...
El resultado se ve así:
+ command1
whatever output from command1
+ command2
whatever output from command2
Mi problema es que la salida de la shell (causada por set -x
) va al stderr, mezclada con la salida de los comandos ( command1
, command2
, ...). Me encantaría tener la salida "normal" en la pantalla (como si el script se ejecutara sin set -x
) y la salida "extra" de bash por separado en un archivo.
Entonces me gustaría tener esto en la pantalla:
whatever output from command1
whatever output from command2
y esto en un archivo de registro:
+ command1
+ command2
(también está bien si el archivo de registro tiene todo junto)
El set -x 2> file
obviamente doens't toman el efecto deseado, porque no es la salida del comando set, pero cambiar el comportamiento de la fiesta.
El uso bash 2> file
de todo el script tampoco hace lo correcto, porque redirige el stderr de cada comando que se ejecuta también en este shell, por lo que no veo el mensaje de error de los comandos.
fuente
Respuestas:
En base a esta respuesta de ServerFault, envíe la salida bash -x al archivo de registro sin interrumpir la salida estándar , las versiones modernas de bash incluyen
BASH_XTRACEFD
específicamente para especificar un descriptor de archivo alternativo para la salida deset -x
Entonces, por ejemplo, puedes hacer
para enviar la salida del
set -x
archivo allogfile
tiempo que conserva la salida estándar regular y las secuencias de error estándar para los siguientes comandos.Tenga en cuenta que el uso de fd 19 es arbitrario: solo necesita ser un descriptor disponible (es decir, no 0, 1, 2 u otro número que ya haya asignado).
fuente
Después de más de un año, he encontrado la solución correcta para tener tanto el resultado "normal" (stdout + stderr - bash trace) en la pantalla como todos juntos (stdout + stderr + bash trace) en un archivo (bash.log) :
fuente
Steeldriver te dio un enfoque. Alternativamente, puede simplemente redirigir STDERR a un archivo:
Sin embargo, eso significa que tanto el resultado creado por la
set -x
opción como cualquier otro mensaje de error producido irán al archivo. La solución de Steeldriver solo redirigirá laset -x
salida, que probablemente sea lo que desea.fuente