/dev/vcs[a]<n>
solo obtendrá la última pantalla completa incluso si se ha desplazado hacia arriba, pero la selección ioctl()
s tal como lo usa gpm
le permitirá volcar la pantalla que se muestra actualmente incluso cuando se haya desplazado hacia arriba.
Entonces puedes hacer:
sleep 3; perl -e '
require "sys/ioctl.ph";
# copy:
ioctl(STDIN, &TIOCLINUX, $arg = pack("CS5", 2, 1, 1, 80, 25, 2));
# paste:
ioctl(STDIN, &TIOCLINUX, $arg = "\3")'; cat > file
Ajuste el 80 y el 25 al ancho y alto reales de su pantalla.
El sleep 3
le da tiempo para desplazarse hacia arriba (con Shift+PageUP ) a la pantalla real que desea volcar. cat > file
redirige el pegado a file
. Termine con Ctrl+D .
Ver console_ioctl(4)
para más detalles.
Si tienes gpm
instalado y funcionando, puede hacer esa selección con el mouse.
El desplazamiento hacia atrás y la selección de la consola virtual de Linux son muy limitados y bastante molestos (cuando cambias de consola, pierdes todo el desplazamiento hacia atrás). En el futuro, te sugiero que uses cosas como GNU screen
o tmux
dentro de él (yo personalmente los uso en terminales aún más capaces). Con ellos, puede tener scrollbacks de búsqueda más grandes y volcarlos fácilmente en archivos (e incluso registrar toda la salida del terminal, además de todas las demás ventajas que vienen con esos multiplexores de terminal).
En cuanto a la automatización del proceso para volcar todo el búfer de desplazamiento hacia atrás, debería ser posible bajo algunas condiciones, pero bastante difícil ya que la API es muy limitada. Hay un ioctl
sin documentar (TIOCLINUX, subcódigo=13) para desplazar la consola virtual actual por algún desplazamiento (negativo para desplazarse hacia arriba, positivo para desplazarse hacia abajo).
Sin embargo, no hay forma (que yo sepa) de saber el tamaño actual del búfer de desplazamiento hacia atrás. Por lo tanto, es difícil saber cuándo ha llegado a la parte superior de ese búfer. Si intenta desplazarse más allá, la pantalla no se desplazará tanto y no hay una forma fiable de saber cuánto se ha desplazado realmente la pantalla.
También encuentro errático el comportamiento del ioctl de desplazamiento (al menos con la consola VGA), donde el desplazamiento de menos de 4 líneas solo funciona ocasionalmente.
La siguiente secuencia de comandos parece funcionar para mí en consolas con búfer de cuadros (y ocasionalmente en consolas VGA) siempre que el búfer de desplazamiento hacia atrás no contenga secuencias de líneas idénticas de más de una pantalla más una línea.
Es bastante lento porque se desplaza una línea a la vez y necesita esperar 10 ms para eof al leer cada volcado de pantalla.
Para ser usado como that-script > file
desde dentro de la consola virtual.
#! /usr/bin/perl
require "sys/ioctl.ph";
($rows,$cols) = split " ", `stty size`;
$stty = `stty -g`; chomp $stty;
system(qw(stty raw -echo icrnl min 0 time 1));
sub scroll {
ioctl(STDIN, &TIOCLINUX, $arg = pack("Cx3l", 13, $_[0])) or die "scroll: $!";
}
sub grab {
ioctl(STDIN, &TIOCLINUX, $arg = pack("CS5", 2, 1, 1, $cols, $rows, 2)) or die "copy: $!";
ioctl(STDIN, &TIOCLINUX, $arg = "\3") or die "paste: $!";
return <STDIN>;
}
for ($s = 0;;$s--) {
scroll $s if $s;
@lines = grab;
if ($s) {
last if "@lines" eq "@lastlines";
unshift @output, $lines[0];
} else {
@output = @lines;
}
@lastlines = @lines;
}
print @output;
exec("stty", $stty);