tuberias salidas salida redirigir redireccionamiento pipes guardar filtros fichero ejemplos comando canal archivo bash shell colors terminal redirect

bash - redireccionamiento - redirigir salidas linux



¿Se puede capturar la salida coloreada mediante redirección de shell? (7)

Descubrí que utilizar script de script para conservar los colores cuando se conecta a less no funciona realmente (menos se estropea y, al salir, bash se estropea) porque menos es interactivo. script parece realmente ensuciar la entrada proveniente de stdin incluso después de salir.

Entonces, en lugar de ejecutar:

script -q /dev/null cargo build | less -R

Lo redirijo /dev/null antes de conectar a menos:

script -q /dev/null cargo build < /dev/null | less -R

Así que ahora el script no se mezcla con stdin y me consigue exactamente lo que quiero. Es el equivalente de command | less command | less pero conserva los colores al mismo tiempo que continúa leyendo el contenido nuevo adjunto al archivo (otros métodos que probé no lo harían).

Esta pregunta ya tiene una respuesta aquí:

Varios comandos de bash que uso: diffs extravagantes, scripts de compilación, etc. producen una gran cantidad de salida de color.

Cuando redirijo esta salida a un archivo, y luego cat o less el archivo más tarde, la coloración se ha ido, presumiblemente b / c el acto de redirigir la salida eliminó los códigos de color que le dicen al terminal que cambie los colores.

¿Hay alguna manera de capturar la salida coloreada, incluida la coloración?


Inspirado por las otras respuestas, comencé a usar script . Tuve que usar -c para hacerlo funcionar. Todas las otras respuestas, incluyendo el tee , diferentes ejemplos de script no funcionaron para mí.

Contexto:

  • Ubuntu 16.04
  • ejecutar pruebas de behave con behave e iniciar el comando de shell durante la prueba con python''s subprocess.check_call()

Solución:

script --flush --quiet --return /tmp/ansible-output.txt --command "my-ansible-command"

Explicación para los interruptores:

  • --flush fue necesario, porque de lo contrario la salida no es bien observable en vivo, llegando en grandes pedazos
  • --quiet el resultado propio de la herramienta de secuencia de comandos
  • -c, --command proporciona directamente el comando para ejecutar, la canalización de mi comando a la secuencia de comandos no funcionó para mí (sin colores)
  • --return para hacer que el script propague el código de salida de mi comando, así sé si mi comando ha fallado

Redirigir no tira los colores, pero muchos comandos detectarán cuando están enviando salida a un terminal, y no producirán colores por defecto si no lo hacen. Por ejemplo, en Linux ls --color=auto (que está asociado a plain ls en muchos lugares) no producirá códigos de color si se envía a una tubería o archivo, pero ls --color hará. Muchas otras herramientas tienen banderas de anulación similares para que guarden la salida coloreada en un archivo, pero todo es específico de la herramienta individual.

Incluso una vez que tiene los códigos de color en un archivo, para verlos debe usar una herramienta que los deje intactos. less tiene un indicador -r para mostrar los datos del archivo en modo "raw"; esto muestra códigos de color. editar: Las versiones un poco más nuevas también tienen un indicador -R que es específicamente consciente de los códigos de color y los muestra correctamente, con mejor soporte para cosas como el ajuste / recorte de líneas que el modo raw porque menos puede decir cuáles son códigos de control y cuáles son en realidad yendo a la pantalla.


Una forma de capturar salida coloreada es con el comando script . La ejecución del script iniciará una sesión de bash donde todo el resultado sin formato se capturará en un archivo ( typescript nombre de forma predeterminada).


Yo uso tee : pipe la salida del comando al filename tee filename tee y mantendrá el color. Y si no quiere ver la salida en la pantalla (que es para lo que es la tee : mostrar y redirigir la salida al mismo tiempo), simplemente envíe la salida de tee a /dev/null :

command | tee filename | tee filename | tee > /dev/null


algunos programas eliminan la coloración cuando se dan cuenta de que el resultado no es un TTY (es decir, cuando los redirige a otro programa). Puede decirles a algunos de ellos que usen el color con fuerza, y dígale al buscapersonas que active la coloración, por ejemplo, use less -R


Esta pregunta sobre superusuario me ayudó cuando mi otra respuesta (que implicaba una tee ) no funcionó. Implica utilizar un unbuffer para hacer que el comando crea que se está ejecutando desde un shell.

Lo instalé usando sudo apt install expect tcl vez de sudo apt-get install expect-dev .

Necesitaba usar este método al redirigir la salida de apt , irónicamente.