Tengo un script bash con muchos resultados y me gustaría cambiar ese script (no crear uno nuevo) para copiar todo el resultado en un archivo, al igual que sucedería si lo pasara por tee.
Tengo un archivo script.sh :
#!/bin/bash
init
do_something_that_outputs_stuff_to_STDOUT
launch_applications_that_output_to_STDOUT
fini
y me gustaría hacer una copia de STDOUT en un archivo script.log sin tener que escribir ./script.sh | tee script.log
todo el tiempo.
Gracias Tom
Respuestas:
No pude hacer funcionar la línea muy simple de Dennis, así que aquí hay un método mucho más complicado. Yo probaría el primero.
Como se mencionó, puede usar exec para redirigir el error estándar y la salida estándar para todo el script. Así:
exec > $LOGFILE 2>&1
esto generará todos los stderr y stdout a $ LOGFILE.Ahora, dado que desea que esto se muestre en la consola, así como en un archivo de registro, también tendrá que usar una tubería con nombre para que el ejecutivo escriba y comience a leer.
(Técnicamente, One-liner de Dennis también hace esto, aunque obviamente de una manera diferente) La tubería en sí está creada con
mkfifo $PIPEFILE
. Luego haz lo siguiente.Si desea ser exhaustivo, puede crear y destruir el archivo de canalización con nombre al principio y al final de su secuencia de comandos.
Para el registro, obtuve la mayor parte de esto de una publicación de blog muy informativa de un tipo aleatorio: ( Versión archivada )
fuente
Simplemente agregue esto al comienzo de su script:
Eso agregará toda la salida enviada a stdout al archivo
script.log
, dejando los contenidos anteriores en su lugar. Si desea comenzar de nuevo cada vez que se ejecuta el script, simplemente agreguerm script.log
justo antes de eseexec
comando o elimine-a
eltee
comando.La
-i
opción hacetee
que ignore las señales de interrupción y puede permitirtee
capturar un conjunto de salida más completo.Agregue esta línea para capturar también todos los errores (en un archivo separado):
Los espacios entre los
>
símbolos múltiples son importantes.fuente
Esta es una versión combinada de la respuesta publicada por Dennis Williamson anteriormente. Agrega err y std a script.log en el orden correcto.
Agregue esta línea al comienzo de su script:
Tenga en cuenta el espacio entre los
>
signos. Funciona para mí en GNU bash, versión 3.2.25 (1) -release (x86_64-redhat-linux-gnu)fuente
Supongo que otro enfoque es algo como esto:
fuente
Si desea una copia de la salida, puede usarla de
tee
esta manera:Sin embargo, esto solo registrará stdout en script.log. Si desea asegurarse de que tanto stderr como stdout se redirigen, use:
Incluso podría hacerlo un poco más agradable con una pequeña función:
fuente
2>&1
afuera y lo conectaría al tee.Simplemente usarías esto:
Esto genera todo en ese registro, todo, además de mostrarlo en la pantalla. Si desea la salida COMPLETA, así es cómo hacerlo.
Y luego puedes volver a reproducir el script si eres flojo.
fuente
script
es un paquete, por ejemplo.sudo apt-get install script
para instalarlo en distribuciones con sabor a Debian, adicionalmentescript -ac 'command opts' ~/Documents/some_log.script
puede revisarse dentro de una terminal a través de algo comostrings ~/Documents/some_log.script | more
;strings
ser una manera simple de desinfectar previamente algunas de las cosas que sescript
inyectan para permitir métodos más sofisticados de reproducción / visualización. De lo contrario, una respuesta sólida @Phishy, porquescript
también conserva las cosas interactivas también.Puede ver más sobre cómo funciona aquí: http://www.xaprb.com/blog/2006/06/06/what-does-devnull-21-mean/
fuente
tee
.