/dev/vcs[a]<n>
erhalten Sie nur den letzten vollen Bildschirm, auch wenn Sie nach oben gescrollt haben, aber die Auswahl ioctl()
s wie von gpm
verwendet ermöglicht es Ihnen, den aktuell angezeigten Bildschirm zu verlassen, selbst wenn Sie nach oben gescrollt haben.
Sie können also Folgendes tun:
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
Passen Sie 80 und 25 an Ihre tatsächliche Bildschirmbreite und -höhe an.
Die sleep 3
gibt Ihnen Zeit, nach oben zu scrollen (mit Shift+PageUP ) zum eigentlichen Bildschirm, den Sie ausgeben möchten. cat > file
leitet das Einfügen auf file
um . Beenden Sie es mit Strg+D .
Siehe console_ioctl(4)
für Details.
Wenn Sie gpm
haben installiert und läuft, können Sie diese Auswahl mit der Maus vornehmen.
Das Scrollback und die Auswahl der virtuellen Linux-Konsole sind sehr begrenzt und ziemlich nervig (wenn Sie die Konsole wechseln, verlieren Sie das gesamte Scrollback). Für die Zukunft würde ich vorschlagen, dass Sie Dinge wie GNU screen
verwenden oder tmux
darin (ich persönlich verwende sie in noch leistungsfähigeren Terminals). Mit ihnen können Sie größere durchsuchbare Scrollbacks haben und sie einfach in Dateien ausgeben (und sogar die gesamte Terminalausgabe protokollieren, plus all die anderen Extras, die mit diesen Terminal-Multiplexern geliefert werden).
Das Automatisieren des Prozesses zum Sichern des gesamten Scrollback-Puffers sollte unter bestimmten Bedingungen möglich sein, aber ziemlich schwierig, da die API sehr begrenzt ist. Es gibt einen undokumentierten ioctl
(TIOCLINUX, Subcode=13), um die aktuelle virtuelle Konsole um einen bestimmten Versatz zu scrollen (negativ zum Scrollen nach oben, positiv zum Scrollen nach unten).
Es gibt jedoch (soweit ich weiß) keine Möglichkeit, die aktuelle Größe des Scrollback-Puffers zu ermitteln. Es ist also schwer zu wissen, wann Sie die Spitze dieses Puffers erreicht haben. Wenn Sie versuchen, daran vorbei zu scrollen, wird der Bildschirm nicht so weit verschoben, und es gibt keine verlässliche Methode, um festzustellen, wie weit der Bildschirm tatsächlich gescrollt wurde.
Unregelmäßig finde ich auch das Verhalten des scrollenden ioctl (zumindest bei der VGA-Konsole), wo das Scrollen um weniger als 4 Zeilen nur gelegentlich funktioniert.
Das folgende Skript scheint für mich auf Frame-Buffer-Konsolen (und gelegentlich auf VGA-Konsolen) zu funktionieren, vorausgesetzt, der Scrollback-Puffer enthält keine Sequenzen identischer Zeilen, die länger als ein Bildschirm plus eine Zeile sind.
Es ist ziemlich langsam, weil es zeilenweise scrollt und beim Lesen jedes Bildschirmauszugs 10 ms auf eof warten muss.
Zu verwenden als that-script > file
aus der virtuellen Konsole.
#! /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);