/dev/vcs[a]<n>
sẽ chỉ giúp bạn có màn hình đầy đủ cuối cùng ngay cả khi bạn đã cuộn lên, nhưng các lựa chọn ioctl()
như được sử dụng gpm
sẽ cho phép bạn bỏ màn hình hiện đang hiển thị ngay cả khi bạn cuộn lên.
Vì vậy, bạn có thể làm:
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
Điều chỉnh 80 và 25 theo chiều rộng và chiều cao màn hình thực tế của bạn.
Việc này sleep 3
cho bạn thời gian để cuộn lên (với Shift+PageUP) đến màn hình thực tế mà bạn muốn kết xuất. cat > file
chuyển hướng dán để file
. Hoàn thành nó với Ctrl+D.
Xem console_ioctl(4)
để biết chi tiết.
Nếu bạn đã gpm
cài đặt và chạy, bạn có thể thực hiện lựa chọn đó bằng chuột.
Việc lựa chọn và cuộn lại bảng điều khiển ảo Linux rất hạn chế và khá khó chịu (trong đó khi bạn chuyển giao bảng điều khiển, bạn sẽ mất toàn bộ cuộn ngược lại). Đi tiếp, tôi khuyên bạn nên sử dụng những thứ như GNU screen
hoặc tmux
bên trong nó (cá nhân tôi sử dụng chúng trong các thiết bị đầu cuối có khả năng hơn nữa). Với chúng, bạn có thể có các cuộn ngược có thể tìm kiếm lớn hơn và dễ dàng chuyển chúng vào các tệp (và thậm chí ghi nhật ký tất cả đầu ra của thiết bị đầu cuối, cộng với tất cả các tính năng khác đi kèm với các bộ ghép kênh đầu cuối đó).
Để tự động hóa quá trình kết xuất toàn bộ bộ đệm cuộn, điều này có thể xảy ra trong một số điều kiện, nhưng khá khó khăn vì API rất hạn chế. Có một tài liệu không có giấy tờ ioctl
(TIOCLINEUX, mã con = 13) để cuộn bảng điều khiển ảo hiện tại bằng một số bù (âm cho cuộn lên, dương để cuộn xuống).
Tuy nhiên, không có cách nào (mà tôi biết) để biết kích thước hiện tại của bộ đệm cuộn. Vì vậy, thật khó để biết khi nào bạn đạt đến đỉnh của bộ đệm đó. Nếu bạn cố cuộn qua màn hình, màn hình sẽ không bị dịch chuyển nhiều và không có cách nào đáng tin cậy để biết màn hình đã thực sự cuộn bao nhiêu.
Tôi cũng thấy hành vi của ioctl cuộn không ổn định (ít nhất là với bảng điều khiển VGA), trong đó việc cuộn dưới 4 dòng chỉ thỉnh thoảng hoạt động.
Kịch bản bên dưới dường như hoạt động với tôi trên các bảng điều khiển bộ đệm khung (và đôi khi trên các bộ VGA) với điều kiện bộ đệm cuộn không chứa các chuỗi giống hệt nhau dài hơn một màn hình cộng với một dòng.
Nó khá chậm vì nó cuộn một dòng mỗi lần và cần đợi 10ms cho eof khi đọc từng kết xuất màn hình.
Được sử dụng như that-script > file
từ trong bảng điều khiển ảo.
#! /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);