Pregunta comando de script que tiene efectos impares al cambiar el tamaño de la ventana de la terminal


Hace poco tiempo decidí registrar todas mis actividades de terminal añadiendo

script -t 0 "/Users/XXXXXXX/terminalLogs/log0$(date '+%y-%m-%d-%H:%M').txt"

a mi archivo .bash_profile Esto funcionó en general como se esperaba, pero he encontrado un problema con el cambio de tamaño de Windows.

Entonces comienzo mi ventana de terminal así:

enter image description here

Todo bien ... si cambio el tamaño de la ventana y abro un archivo usando vim obtengo:

enter image description here

(Notarás que la ventana de vim es más pequeña que la ventana de la terminal)

Si escribo 'salir' para salir del registro y cambio de tamaño, obtengo el terminal vim que esperaba.

enter image description here

Así que estoy un poco confundido y sería genial si las personas pudieran explicar lo que está sucediendo, o si pudieran sugerir una modificación, o si la gente tiene mejores ideas sobre cómo debería estar registrando comandos. :(


2


origen


Sería interesante si tienes el mismo comportamiento con otra aplicación de terminal, como iTerm2. ¿Has probado esto? - cyphorious


Respuestas:


Cuando cambia el tamaño de la ventana de un emulador de terminal, ajusta su pseudo terminal ("Pty") haciendo una llamada al sistema ioctl TIOCSWINSZ (Terminal IO Control Set WINdow SiZe). A su vez, el núcleo envía una señal SIGWINCH (WINdow CHange) al grupo de procesos en primer plano (por ejemplo, la instancia en ejecución de Empuje) de ese pty. Finalmente, los programas que recibieron SIGWINCH pueden usar TIOCGWINSZ (G for Get) ioctl para recuperar las nuevas dimensiones y volver a dibujarlas según corresponda.

Debido a la forma en que guión programa funciona, los programas ejecutan "dentro" del guión la sesión se está ejecutando en un pty diferente del pty creado por el emulador de terminal.

Considere este registro:

% tty
/dev/ttys003
% script
Script started, output file is typescript
% tty
/dev/ttys004
% exit

Script done, output file is typescript

Inicialmente, el shell se está ejecutando ttys003, pero el caparazón que se inicia "dentro" del guión la sesión se está ejecutando ttys004.

Si cambié el tamaño de la ventana del emulador de terminal antes de salir del guión sesión, el emulador de terminal establecería el nuevo tamaño para ttys003, y el kernel enviaría un SIGWINCH al guión programa (el proceso en primer plano de ttys003) Idealmente, el guión el programa leería las nuevas dimensiones del "exterior" pty y establecería que el pty "interno" tuviera el mismo tamaño. Esto, a su vez, causaría que el grupo de procesos en primer plano ttys004 (es decir, su Empuje instancia) para recibir un SIGWINCH.

Desafortunadamente, la versión de guión Tu estas usando (La versión de Apple del León?) no parece pasar el cambio en el tamaño de la ventana (y SIGWINCH no administrado se ignora efectivamente). Otras versiones (de util-linux-ng) parecen hacer un mejor trabajo en el manejo de SIGWINCH, pero es posible que no sean fácilmente compilables en su sistema.


Si puede soportar activar manualmente la adaptación al nuevo tamaño, entonces simplemente puede ejecutar el redimensionar comando (/usr/X11/bin/resize) dentro de la pty "interna". Consultará el emulador de terminal para el tamaño apropiado usando secuencias de escape y luego establecerá la pty en las dimensiones correctas. En su escenario indicado, podría hacer :!resize desde adentro de tu Empuje instancia para cambiar el tamaño del pty "interno" (que Vim notará una vez que el :! el comando ha terminado).

Si quiere que el cambio de tamaño automático funcione, entonces tendrá que encontrar una versión de guión que propaga apropiadamente los cambios de dimensión (al manejar SIGWINCH y hacer las ioctl apropiadas). Alternativamente, es posible que pueda reemplazar su script invocación con una invocación del siguiente programa Esperar:

#!/usr/bin/expect
proc date {fmt} {
    clock format [clock seconds] -format $fmt
}
set file [if {$argc > 0} {lindex $argv 0} {list typescript}]

send_user "Script started, output file is $file\n"
log_file "$file"
send_log "Script started on [date %+]\n"

# WINCH code from http://ubuntuforums.org/showthread.php?t=865420
trap {
 set rows [stty rows]
 set cols [stty columns]
 stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH

spawn -noecho $env(SHELL)
interact

send_log "\nScript done on [date %+]\n"
log_file
send_user "Script done, output file is $file\n"

Dale un nombre de archivo como único argumento:

 /path/to/script.expect "$HOME/terminalLogs/log0$(date '+%y-%m-%d-%H:%M').txt"

4



wow ... esa es toda la respuesta ... :) - Joe


No tengo una respuesta definitiva, pero ...

  • De acuerdo con su página man ($ man script), script parece que no le gustan los programas interactivos:

Ciertos comandos interactivos, como vi (1), crean basura en el   archivo mecanografiado. La utilidad de script funciona mejor con comandos que   no manipules la pantalla Los resultados están destinados a emular un   terminal de copia impresa, no direccionable.

  • El tamaño "predeterminado" es el mismo que el tamaño de su ventana cuando comienza script.

  • Es posible que script Reinicia o deshabilita una gran cantidad de funciones (como la capacidad de cambiar el tamaño de la ventana). La página man guarda silencio sobre este tema, pero creo que tendría sentido evitar el cambio de tamaño.


0