/dev/vcs[a]<n>
hanya akan memberi Anda layar penuh-penuh bahkan jika Anda telah menggulir ke atas, tetapi pilihan ioctl()
seperti yang digunakan oleh gpm
akan memungkinkan Anda untuk membuang layar yang saat ini ditampilkan bahkan ketika Anda sudah menggulir ke atas.
Jadi bisa Anda lakukan:
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 Anda yang sebenarnya.
Ini sleep 3
memberi Anda waktu untuk menggulir ke atas (dengan Shift+PageUP) ke layar aktual yang ingin Anda buang. cat > file
mengarahkan ulang pasta ke file
. Akhiri dengan Ctrl+D.
Lihat console_ioctl(4)
detailnya.
Jika Anda telah gpm
menginstal dan menjalankan, Anda dapat melakukan pemilihan dengan mouse.
Scrollback dan seleksi konsol virtual Linux sangat terbatas dan cukup menjengkelkan (karena ketika Anda mengganti 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 bahkan lebih mampu). Dengan mereka, Anda dapat memiliki scrollback yang lebih besar yang dapat dicari dan dengan mudah membuangnya ke file (dan bahkan mencatat semua output terminal, ditambah semua barang lain yang datang dengan multiplexer terminal tersebut).
Seperti untuk mengotomatisasi proses untuk membuang seluruh buffer scrollback, itu harus dimungkinkan dalam beberapa kondisi, tetapi cukup sulit karena API sangat terbatas. Ada yang tidak berdokumen ioctl
(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 saat ini dari buffer scrollback. Jadi sulit untuk mengetahui kapan Anda telah mencapai bagian atas buffer itu. Jika Anda mencoba menggulir melewatinya, layar tidak akan bergeser sebanyak dan tidak ada cara yang dapat diandalkan untuk mengetahui seberapa banyak layar sebenarnya telah digulir.
Saya juga menemukan perilaku bergulir ioctl tidak menentu (setidaknya dengan konsol VGA), di mana bergulir dengan kurang dari 4 baris hanya bekerja sesekali.
Skrip di bawah ini tampaknya berfungsi untuk saya pada konsol penyangga bingkai (dan kadang-kadang pada yang VGA) asalkan penyangga scrollback tidak mengandung urutan garis identik yang lebih panjang dari satu layar plus satu baris.
Ini cukup lambat karena menggulirkan satu baris pada satu waktu, dan perlu menunggu 10 ms untuk bukti ketika membaca setiap layar 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);