/dev/vcs[a]<n>
hanya akan membuat Anda layar penuh terakhir meskipun Anda telah menggulir ke atas, tetapi pilihan ioctl()
s seperti yang digunakan oleh gpm
akan memungkinkan Anda membuang layar yang saat ini ditampilkan bahkan saat Anda menggulir ke atas.
Sehingga Anda dapat melakukan:
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
Sesuaikan 80 dan 25 dengan lebar dan tinggi layar sebenarnya.
sleep 3
memberi Anda waktu untuk menggulir ke atas (dengan Shift+PageUP ) ke layar sebenarnya yang ingin Anda buang. cat > file
mengalihkan tempel ke file
. Selesaikan dengan Ctrl+D .
Lihat console_ioctl(4)
untuk detailnya.
Jika Anda memiliki gpm
terinstal dan berjalan, Anda dapat melakukan pemilihan itu dengan mouse.
Scrollback dan pemilihan konsol virtual Linux sangat terbatas dan cukup mengganggu (saat Anda beralih konsol, Anda kehilangan seluruh scrollback). Ke depan, saya sarankan Anda menggunakan hal-hal seperti GNU screen
atau tmux
di dalamnya (saya pribadi menggunakannya di terminal yang lebih mampu). Dengan mereka, Anda dapat memiliki scrollback lebih besar yang dapat ditelusuri dan dengan mudah membuangnya ke file (dan bahkan mencatat semua output terminal, ditambah semua barang lain yang disertakan dengan multiplexer terminal tersebut).
Untuk mengotomatiskan proses untuk membuang seluruh buffer scrollback, seharusnya dimungkinkan dalam beberapa kondisi, tetapi cukup sulit karena API sangat terbatas. Ada ioctl
yang tidak berdokumen (TIOCLINUX, subcode=13) untuk menggulir konsol virtual saat ini dengan beberapa offset (negatif untuk menggulir ke atas, positif untuk menggulir ke bawah).
Namun tidak ada cara (yang saya tahu) untuk mengetahui ukuran buffer scrollback saat ini. Jadi sulit untuk mengetahui kapan Anda telah mencapai puncak penyangga itu. Jika Anda mencoba men-scroll melewatinya, layar tidak akan terlalu banyak digeser dan tidak ada cara yang dapat diandalkan untuk mengetahui seberapa banyak sebenarnya layar telah di-scroll.
Saya juga menemukan perilaku pengguliran ioctl tidak menentu (setidaknya dengan konsol VGA), di mana pengguliran kurang dari 4 baris hanya berfungsi sesekali.
Skrip di bawah tampaknya berfungsi untuk saya di konsol buffer bingkai (dan kadang-kadang di konsol VGA) asalkan buffer scrollback tidak berisi urutan garis identik yang lebih panjang dari satu layar ditambah satu baris.
Ini cukup lambat karena menggulir satu baris pada satu waktu, dan perlu menunggu 10 md selama beberapa saat saat membaca setiap screen dump.
Untuk digunakan sebagai that-script > file
dari dalam konsol 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);