Tengo un script de shell con set -xuna 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> fileobviamente 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> filede 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_XTRACEFDespecíficamente para especificar un descriptor de archivo alternativo para la salida deset -xEntonces, por ejemplo, puedes hacer
para enviar la salida del
set -xarchivo allogfiletiempo 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 -xopción como cualquier otro mensaje de error producido irán al archivo. La solución de Steeldriver solo redirigirá laset -xsalida, que probablemente sea lo que desea.fuente