/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
ภายใน (ฉันใช้มันในอาคารที่มีความสามารถมากกว่า) คุณสามารถมี scrollbacks ที่ค้นหาได้มากขึ้นและถ่ายโอนไฟล์ไปยังไฟล์ได้อย่างง่ายดาย (และบันทึกการทำงานของเทอร์มินัลเอาท์พุทรวมถึงสินค้าอื่น ๆ ที่มาพร้อมกับเทอร์มินัลมัลติเพล็กเซอร์เหล่านั้น)
สำหรับกระบวนการที่จะถ่ายโอนบัฟเฟอร์การเลื่อนกลับทั้งตัวโดยอัตโนมัติกระบวนการนี้ควรเป็นไปได้ภายใต้เงื่อนไขบางประการ แต่ค่อนข้างยากเนื่องจาก API มีข้อ จำกัด มาก มีการไม่มีเอกสารioctl
(TIOCLINUX, subcode = 13) เพื่อเลื่อนคอนโซลเสมือนปัจจุบันโดยออฟเซ็ตบางอย่าง (เชิงลบสำหรับการเลื่อนขึ้น, บวกสำหรับการเลื่อนลง)
อย่างไรก็ตามไม่มีทาง (ที่ฉันรู้) รู้ขนาดปัจจุบันของบัฟเฟอร์การเลื่อน ดังนั้นจึงเป็นการยากที่จะรู้ว่าเมื่อคุณมาถึงจุดสูงสุดของบัฟเฟอร์นั้น หากคุณพยายามเลื่อนผ่านหน้าจอจะไม่เลื่อนไปมากและไม่มีวิธีที่เชื่อถือได้ที่จะรู้ได้ว่าหน้าจอเลื่อนไปเท่าใด
ฉันยังพบพฤติกรรมของการเลื่อน ioctl ที่ผิดปกติ (อย่างน้อยกับคอนโซล VGA) ซึ่งการเลื่อนโดยน้อยกว่า 4 บรรทัดใช้งานได้เป็นครั้งคราวเท่านั้น
สคริปต์ด้านล่างดูเหมือนจะทำงานกับฉันในคอนโซลเฟรมบัฟเฟอร์ (และบางครั้งใน VGA) หากบัฟเฟอร์ scrollback ไม่ได้มีลำดับของบรรทัดที่เหมือนกันนานกว่าหนึ่งหน้าจอบวกหนึ่งบรรทัด
มันค่อนข้างช้าเพราะมันเลื่อนทีละหนึ่งบรรทัดและต้องรอ 10 มิลลิวินาทีสำหรับ 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);