En el shell de Unix, tengo un archivo env (el archivo env define los parámetros necesarios para ejecutar el script de usuario, como el nombre y la ruta del archivo de registro, redirigir las salidas y los errores al archivo de registro, los detalles de la conexión de la base de datos, etc. ) que redirige todas las salidas ( mensajes de eco ) y errores en el archivo de registro del script ejecutado utilizando el siguiente código:
exec 1>>${LOG_FILE}
exec 2>>${LOG_FILE}
El archivo env se ejecuta al principio de cada script. Debido al código anterior en el archivo env, todas las salidas de la consola que pueden ser salidas de usuario o errores se envían directamente al archivo de registro, que es lo que realmente necesitaba.
Pero hay algunas salidas de usuario selectivas que quiero que se muestren tanto en la consola como en el archivo de registro. Pero debido al código anterior no puedo hacerlo.
Sé que si elimino el código anterior puedo obtener el resultado deseado para este caso, pero tendré que escribir manualmente todas las demás salidas en el archivo de registro, lo cual no es una tarea fácil.
¿Hay alguna forma de obtener la salida tanto en la consola como en el archivo de registro sin eliminar los códigos anteriores?
/dev/fd/3
es un nombre de archivo que se refiere al "fd 3 actualmente abierto", portee /dev/fd/3
lo que escribirá lo que llegue en su stdin a fd 1 y también a fd 3 (el/dev/fd/3
archivo). Fd 1 está conectado al archivo de registro, fd 3 está conectado a la consola.echo "blah" | tee file1.txt | tee file2.txt >/dev/null
'Blah' no se colocará en file1.txt & file2.txt, pero no se escribirá en la consola.tee
, que a su vez escribe en la terminal) en lugar de ir directamente a una terminal y ajustar su salida para que coincida.Sí, quieres usar
tee
:Simplemente canalice su comando a tee y pase el archivo como un argumento, así:
Esto imprime la salida en STDOUT y escribe la misma salida en un archivo de registro. Consulte
man tee
para obtener más información.Tenga en cuenta que esto no escribirá stderr en el archivo de registro, por lo que si desea combinar las dos secuencias, use:
fuente
script.sh: line 5: exec: 1: not found
Probé la respuesta de Joonty, pero también obtuve la
error. Esto es lo que funciona mejor para mí ( confirmado que también funciona en zsh):
El archivo /tmp/both.log luego contiene
El /tmp/both.log se adjunta a menos que elimine la -a de tee.
Pista:
>(...)
es una sustitución de proceso. Permite que elexec
de latee
orden como si se tratara de un archivo.fuente
exec > >(tee ${LOG_FILE}) 2>&1
.Quería mostrar los registros en stdout y el archivo de registro junto con la marca de tiempo. Ninguna de las respuestas anteriores funcionó para mí. Hice uso de la sustitución de procesos y el comando exec y se me ocurrió el siguiente código. Registros de muestra:
Agregue las siguientes líneas en la parte superior de su secuencia de comandos:
¡Espero que esto ayude a alguien!
fuente
para el archivo de registro puede fechar para ingresar datos de texto. el siguiente código puede ayudar
Salida: 2. El archivo de registro se creará en la primera ejecución y se actualizará en las próximas ejecuciones. En caso de que falte el archivo de registro en una ejecución futura, el script creará un nuevo archivo de registro.
fuente
Encontré una manera de obtener el resultado deseado. Aunque puede ser una forma poco ortodoxa. De todos modos aquí va. En el archivo redir.env tengo el siguiente código:
Luego, en el script real, tengo los siguientes códigos:
Aquí eco salidas sólo para la consola, inicie sesión salidas a registrar sólo los archivos y mensajes salidas tanto al archivo de registro y la consola.
Después de ejecutar el archivo de script anterior, tengo los siguientes resultados:
En consola
Para el archivo de registro
Espero que esto ayude.
fuente
Prueba esto, hará el trabajo:
fuente
exec > >(tee -a ${log_file} )
funciona perfecto para mis necesidades. Las soluciones anteriores anteriores interrumpirían partes de mi script que forzarían la salida si fallaban. Graciasfuente
Me parece muy útil agregar stdout y stderr a un archivo de registro. Me alegré de ver una solución de alfonx con
exec > >(tee -a)
, porque me preguntaba cómo lograr esto usandoexec
. Encontré una solución creativa usando la sintaxis here-doc y.
: /unix/80707/how-to-output-text-to-both-screen-and-file-inside-a-shell -guiónDescubrí que en zsh, la solución here-doc se puede modificar usando la construcción "multios" para copiar la salida tanto en stdout / stderr como en el archivo de registro:
No es tan legible como la
exec
solución, pero tiene la ventaja de permitirle registrar solo una parte del script. Por supuesto, si omite el EOF, todo el script se ejecuta con el registro. No estoy seguro de cómozsh
implementa multios, pero puede tener menos gastos generales quetee
. Desafortunadamente, parece que no se pueden usar multios conexec
.fuente