¿Cómo redirigir la salida a la pantalla y a un archivo?

12

Mi objetivo es registrar toda la salida de un script en un directorio que el script creará.

Por ejemplo, tengo:

~/.abc.sh:

#! /bin/bash
rails new myapp

Cuando corro ...

cd ~/code
. ~/.abc.sh

... que creará una nueva aplicación Rails en el directorio ~/code/myapp.

Cuando Rails está creando una aplicación, genera una gran cantidad de texto que quiero capturar y almacenar en un archivo de registro en el mismo directorio que el railscomando recién creado. También quiero mostrar ese texto en la terminal también.

¿Cómo voy a hacer esto?

Zabba
fuente

Respuestas:

23

Puede usar el teecomando para eso:

command | tee /path/to/logfile

El equivalente sin escribir en el shell sería:

command > /path/to/logfile

Si desea agregar ( >>) y mostrar el resultado en el shell, use la -aopción:

command | tee -a /path/to/logfile

Tenga en cuenta que la tubería solo atrapará stdout, la tubería no procesa los errores de stderr con tee. Si desea registrar errores (desde stderr), use:

command 2>&1 | tee /path/to/logfile

Esto significa: ejecutar commandy redirigir la secuencia stderr (2) a stdout (1). Eso se pasará a la tubería con la teeaplicación.

Lekensteyn
fuente
Qué quiere decir ~/.abc.sh | tee <file>? Si es así, entonces el problema es que no sé en qué directorio el script creará la aplicación cuando lo llame, entonces, ¿cómo sabría qué dar en el fileargumento? (Gracias por los excelentes ejemplos)
Zabba
@Zabba: ¿qué hay de crear un archivo temporal y moverlo después?
Lekensteyn
Ok, eso debería funcionar :). Con respecto a eso, ¿cómo puedo crear un archivo temporal con un nombre aleatorio que luego pueda imprimir y luego copiar en la ubicación deseada? ¿Hay algún comando incorporado para obtener un "nombre de archivo temporal"?
Zabba
@Zabba: el comando para eso es mktemp. Ver la página del manual man mktemp.
Lekensteyn
跪拜, trabaja como un encanto
Sun Junwen
0

scriptiniciará una sesión interactiva y registrará toda la salida (stdout / stderr, etc.) en un archivo, o (con el -cparámetro) ejecutará un comando y registrará la salida de eso.

script -c ~/.abc.sh -f abc.log

Nota: en una sesión interactiva, puede detener la grabación simplemente saliendo de la sesión como lo haría normalmente (por ejemplo, exito Ctrl-D).

Para la grabación de sesiones con reproducción de video, también puede probar asciinema .

mwfearnley
fuente