/dev/vcs[a]<n>
위로 스크롤 한 경우에도 마지막 화면이 꽉 찼지만 스크롤 ioctl()
을 사용해 gpm
도 현재 표시된 화면을 덤프 할 수 있습니다.
그래서 당신은 할 수 있습니다 :
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
실제 화면 너비와 높이에 80과 25를 조정하십시오.
을 sleep 3
사용하면 Shift+PageUP덤프하려는 실제 화면 으로 스크롤 할 시간 이 생깁니다. cat > file
붙여 넣기를로 리디렉션합니다 file
. 로 완료하십시오 Ctrl+D.
자세한 내용 console_ioctl(4)
을 참조하십시오.
이 경우 gpm
설치 및 실행, 당신은 마우스로 해당 선택을 할 수 있습니다.
Linux 가상 콘솔 스크롤 백 및 선택은 매우 제한적이고 성가시다 (콘솔을 전환하면 전체 스크롤 백이 손실 됨). 앞으로 GNU와 같은 것을 사용 screen
하거나 그 tmux
내부에서 사용하는 것이 좋습니다 (개인적으로 더 유능한 터미널에서 사용합니다). 그것들을 사용하면 더 큰 검색 가능한 스크롤 백을 가지고 파일에 쉽게 덤프 할 수 있습니다 (그리고 모든 터미널 출력과 터미널 멀티플렉서와 함께 제공되는 다른 모든 것들을 기록 할 수도 있습니다).
전체 스크롤 백 버퍼를 덤프하는 프로세스를 자동화하는 경우 일부 조건에서는 가능하지만 API가 매우 제한되어 있기 때문에 상당히 어렵습니다. ioctl
현재 가상 콘솔을 일부 오프셋 (스크롤 할 경우 음수, 아래로 스크롤하는 경우 양수)만큼 스크롤 할 수 있는 문서화되지 않은 (TIOCLINUX, 서브 코드 = 13)이 있습니다.
그러나 스크롤 백 버퍼의 현재 크기를 알 수있는 방법은 없습니다. 따라서 언제 버퍼 상단에 도달했는지 알기가 어렵습니다. 그것을 지나서 스크롤하려고하면 화면이 많이 이동하지 않으며 화면이 실제로 얼마나 많이 스크롤되었는지 알 수있는 확실한 방법이 없습니다.
또한 스크롤이 가능한 ioctl의 동작 (최소한 VGA 콘솔에서는)이 4 줄 미만으로 스크롤되는 경우가 가끔 있습니다.
아래 스크립트는 스크롤 버퍼에 하나의 스크린과 한 줄보다 긴 동일한 행 시퀀스가 포함되어 있지 않으면 프레임 버퍼 콘솔 (때로는 VGA 콘솔)에서 작동하는 것 같습니다.
한 번에 한 줄씩 스크롤하기 때문에 속도가 느리고 각 화면 덤프를 읽을 때 10ms 동안 eof를 기다려야합니다.
that-script > file
가상 콘솔 내에서 와 같이 사용됩니다 .
#! /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);