Dado un comando que cambia su comportamiento cuando su salida se dirige a un terminal (por ejemplo, produce una salida coloreada), ¿cómo se puede redirigir esa salida en una tubería mientras se preserva el comportamiento cambiado? Debe haber una utilidad para eso, que no conozco.
Algunos comandos, como grep --color=always
, tienen indicadores de opción para forzar el comportamiento, pero la pregunta es cómo solucionar los programas que se basan únicamente en probar su descriptor de archivo de salida.
Si importa, mi shell está bash
en Linux.
Respuestas:
Puede obtener lo que necesita usando
unbuffer
.unbuffer
es untcl
/expect
script. Mira la fuente si quieres. También tenga en cuenta la sección CUEVAS en man.También tenga en cuenta que no ejecuta alias como:
a menos que uno agregue un truco como lo señaló Stéphane Chazelas:
Si hace un
alias unbuffer='unbuffer '
(observe el espacio final), los alias se expandirán despuésunbuffer
.fuente
alias unbuffer='unbuffer '
(observe el espacio final), los alias se expandirán despuésunbuffer
.unbuffer
¡está!sudo apt install expect
- Eso no estaba claro.Una historia de conjuntos de herramientas.
No eres la primera persona que quiere esa herramienta. La gente ha querido estas herramientas durante 30 años. Y han existido durante casi tanto tiempo también.
La primera herramienta para este tipo de cosas fue el paquete "pty" de Daniel J. Bernstein, descrito por Rich Salz como un "cuchillo Ginsu", que Bernstein escribió a principios de la década de 1990 para engañar a nethack (¡sic!). La versión 4 del paquete "pty" se publicó en 1992
comp.sources.unix
(volumen 25, números 127 a 135). Todavía es localizable en la World Wide Web. Paul Vixie lo describió en ese momento:Bernstein más tarde actualizó esto, en algún momento antes del 07/04/1999, con un paquete "ptyget", que anunció:
Ese paquete separado era el paquete "sess".
"ptyget" es, por cierto, notable por ejemplificar una versión muy temprana y una de las pocas instancias publicadas del propio sistema de compilación "rehacer" nunca publicado por Berstein.
dependon
es un claro precursorredo-ifchange
.Uso
ptybandage
ptybandage
es lo que la gente suele querer en una sesión de inicio de sesión. Su caso de uso principal es hacer que los programas que son sensibles a si sus entradas, salidas o errores estándar están conectados a los terminales funcionen de esa manera, incluso si de hecho están en tuberías de shell, o tienen sus descriptores de archivo estándar redirigidos a un archivo.Se necesita un comando a ejecutar (que tiene que ser un comando externo adecuado, por supuesto) y lo ejecuta de tal manera que se cree que su nivel de entrada, salida y error están asociadas a un terminal, la conexión de aquellos a través de
ptybandage
's Entrada estándar original, salida y error.Se ocupa de los matices de ejecutar bajo shells de control de trabajo, asegurando que un carácter STOP de terminal no solo se detenga
ptybandage
sino que también detenga el programa en ejecución conectado al terminal interno.ptyrun
ptyrun
es lo que la gente suele querer en los servidores de red TCP. Su caso de uso principal es entornos de ejecución remota que no han configurado terminales, ejecutando programas que no funcionan como se desea cuando no hay terminal.No espera ejecutarse bajo un shell de control de trabajo, y si el comando que se ejecuta recibe una señal de detención, simplemente se reinicia.
Conjuntos de herramientas disponibles
Dru Nelson publica "pty" versión 4 y "ptyget".
Paul Jarc publica una versión fija de ptyget, que intenta lidiar con los ioctls de dispositivos pseudo-terminales específicos del sistema operativo en el original que los sistemas operativos ya no proporcionan.
El paquete fuente nosh viene con workalike
ptybandange
yptyrun
scripts, que usan laexecline
herramienta de Laurent Bercot y los propios comandos de gestión de pseudo-terminal del paquete nosh. A partir de la versión 1.23 de nosh, estos están disponibles preempacados en el paquete nosh-terminal-extras. (Las versiones anteriores solo las suministraban a las personas que construían desde la fuente).Algunos ejemplos de usos
Jurjgen Oskam utiliza
ptybandage
en AIX para alimentar la entrada de un documento aquí a un programa que se abre explícitamente y lee su terminal de control para solicitar una contraseña:Andy Bradford usa
ptyrun
en OpenBSD bajo daemontools y ucspi-tcp para hacer que elbgplgsh
programa de control de enrutador interactivo sea accesible a través de la red mientras hace pensar que está hablando con un terminal:Otras lecturas
redo
. Respuestas frecuentes.bgplgsh
. 8. Páginas del manual de OpenBSD.fuente
expect
?Puede usar socat para comenzar su proceso con una pty conectada y obtener socat para conectar el otro extremo de la pty a un archivo. Qué AFAIU es exactamente lo que preguntaste:
Este método hará que
isatty
llame pormy-command
regresartrue
y un proceso que se basa solo en eso será engañado a los códigos de control de salida. Tenga en cuenta que algunos procesos (en particulargrep
) también verifican el valor de laTERM
variable de entorno, por lo que es posible que deba establecerlo en algo razonable, como"xterm"
fuente
También hay una buena solución publicada aquí en Super User por KarlC :
Compile una pequeña biblioteca compartida:
Luego diga a su comando que cargue esta
isatty(3)
anulación dinámicamenteEsto podría no funcionar para todos los comandos, incluso puede romper algunos de manera inesperada, pero probablemente funcionaría en la mayoría de los casos.
fuente
DYLD_INSERT_LIBRARIES=./isatty.so DYLD_FORCE_FLAT_NAMESPACE=y mycommand
¿Qué tal el uso
script(1)
?Por ejemplo:
Guardará la
ls
salidaout_file
con los códigos de color preservados.fuente
out_file
con sus colores?less -R
. Sin embargo, en este caso, quería que la salida continuara en la tubería, que finalmente terminó en mi terminal. Usandocat
como ilustración, fue algo así comoscript -q -c 'ls -G' /dev/null | cat
, que suprime eltypescript
archivo por completo, dejando solo la salida del programa.-
) comoscript
archivo de salida, por ejemplo:script -q -c 'ls -G' -
Basado en la respuesta de @ Amir , aquí hay un script que genera y luego incluye la biblioteca en tiempo de ejecución:
fuente