Wie ändere ich das Verhalten von ** clear ** auf CentOS7 so, dass auf Xterm KEINE Scrollback-Puffer gelöscht werden?

519
halbeik

Ich habe eine VM, auf der CentOs 7.2.1511 ausgeführt wird . Es enthält die folgenden Hinweise: 5.9 . Ich verwende sowohl MobaXterm als auch PuTTY.

Immer wenn ich den Befehl clear ausführen, werden auch die Scrollback-Puffer automatisch gelöscht.

Dieses Verhalten wird in ncurses 5.7 (auf einem anderen CentOs VM CentOS-Release 6.5 (Final)) nicht beobachtet.

Beim Lesen von ncurses changelog wurde eine Änderung vorgenommen, so dass ncurses "die erweiterte E3-Fähigkeit zum Löschen des Scrollback-Puffers des Terminals" berücksichtigt.

Die Manpage erwähnt auch terminfo:

Es sucht in der Umgebung nach dem Terminaltyp und dann in der terminfo-Datenbank, um herauszufinden, wie der Bildschirm gelöscht wird .

So term hat Daten, die klar verwendet, um zu bestimmen, ob es das Endgerät der Rückholung Puffer löschen sollte. Ich habe ein Dienstprogramm gefunden, infocmp, das terminfo-Beschreibungen ausdrucken kann.

Infocmp

NAME

 infocmp - compare or print out terminfo descriptions 

Ich habe die Ausgabe unter Details angegeben.

Der Eintrag "clear" in terminfo zeigt dieses "clear = \ E [H \ E [2J,".

Wenn ich strace clear auf der CentOS7 VM starte, sehe ich das (vollständige Strace ist unten, unter Details)

write(1, "\33[3;J\33[H\33[2J", 12 ) = 12 

Wenn ich strace clear auf der CentOS6.5 VM starte, sehe ich das

write(1, "\33[H\33[2J", 7 ) 

Ich denke, dass die neue Version von clear etwas von irgendwo aufgreift, in dem gesagt wird, dass " \ 33 [3; J " vorangestellt wird . (Das ist wahrscheinlich die Änderung, über die das Changelog spricht.)

Aber wie die Manpage feststellte; diese Informationen werden von terminfo gesammelt . Mein Terminfo-Clear-Eintrag hat nicht \ 33 [3; J \ 33 [H \ 33 [2J ; es hat vielmehr \ 33 [H \ 33 [2J .

So; wenn mir etwas fehlt und dies kein Fehler in ncurses 5.9 ist;

Wie ändere ich das Verhalten von clear in Centos7, um den Scrollback-Puffer NICHT zu löschen?

Ich möchte weder den Code ändern, noch kompilieren, noch 5.9 durch 5.7 ersetzen.

Danke euch allen


Details :

Betriebssystem: CentOS Linux Version 7.2.1511 (Core) ncurses: ncurses Version 5.9 (Patch 20130511) [von 'man clear' abgerufen]

Ausgabe von Infocmp auf CentOS 7 :

# infocmp # Reconstructed via infocmp from file: /usr/share/terminfo/x/xterm xterm|xterm terminal emulator (X Window System), am, bce, km, mc5i, mir, msgr, npc, xenl, colors#8, cols#80, it#8, lines#24, pairs#64, acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l, clear=\E[H\E[2J, cnorm=\E[?12l\E[?25h, cr=^M, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A, cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=^J, indn=\E[%p1%dS, invis=\E[8m, is2=\E[!p\E[?3;4l\E[4l\E>, kDC=\E[3;2~, kEND=\E[1;2F, kHOM=\E[1;2H, kIC=\E[2;2~, kLFT=\E[1;2D, kNXT=\E[6;2~, kPRV=\E[5;2~, kRIT=\E[1;2C, kb2=\EOE, kbs=\177, kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[3~, kend=\EOF, kent=\EOM, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[1;2P, kf14=\E[1;2Q, kf15=\E[1;2R, kf16=\E[1;2S, kf17=\E[15;2~, kf18=\E[17;2~, kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~, kf21=\E[20;2~, kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~, kf25=\E[1;5P, kf26=\E[1;5Q, kf27=\E[1;5R, kf28=\E[1;5S, kf29=\E[15;5~, kf3=\EOR, kf30=\E[17;5~, kf31=\E[18;5~, kf32=\E[19;5~, kf33=\E[20;5~, kf34=\E[21;5~, kf35=\E[23;5~, kf36=\E[24;5~, kf37=\E[1;6P, kf38=\E[1;6Q, kf39=\E[1;6R, kf4=\EOS, kf40=\E[1;6S, kf41=\E[15;6~, kf42=\E[17;6~, kf43=\E[18;6~, kf44=\E[19;6~, kf45=\E[20;6~, kf46=\E[21;6~, kf47=\E[23;6~, kf48=\E[24;6~, kf49=\E[1;3P, kf5=\E[15~, kf50=\E[1;3Q, kf51=\E[1;3R, kf52=\E[1;3S, kf53=\E[15;3~, kf54=\E[17;3~, kf55=\E[18;3~, kf56=\E[19;3~, kf57=\E[20;3~, kf58=\E[21;3~, kf59=\E[23;3~, kf6=\E[17~, kf60=\E[24;3~, kf61=\E[1;4P, kf62=\E[1;4Q, kf63=\E[1;4R, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\EOH, kich1=\E[2~, kind=\E[1;2B, kmous=\E[M, knp=\E[6~, kpp=\E[5~, kri=\E[1;2A, mc0=\E[i, mc4=\E[4i, mc5=\E[5i, meml=\El, memu=\Em, op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM, rin=\E[%p1%dT, rmacs=\E(B, rmam=\E[?7l, rmcup=\E[?1049l, rmir=\E[4l, rmkx=\E[?1l\E>, rmm=\E[?1034l, rmso=\E[27m, rmul=\E[24m, rs1=\Ec, rs2=\E[!p\E[?3;4l\E[4l\E>, sc=\E7, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, setb=\E[4%?%p1%%=%t4%e%p1%%=%t6%e%p1%%=%t1%e%p1%%=%t3%e%p1%d%;m, setf=\E[3%?%p1%%=%t4%e%p1%%=%t6%e%p1%%=%t1%e%p1%%=%t3%e%p1%d%;m, sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m, sgr0=\E(B\E[m, smacs=\E(0, smam=\E[?7h, smcup=\E[?1049h, smir=\E[4h, smkx=\E[?1h\E=, smm=\E[?1034h, smso=\E[7m, smul=\E[4m, tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?1;2c, u9=\E[c, vpa=\E[%i%p1%dd, 

strace clear: (CentOS7)

# strace clear execve("/bin/clear", ["clear"], [/* 36 vars */]) = 0 brk(0) = 0xf60000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd26198c000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 fstat(3, ) = 0 mmap(NULL, 41031, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fd261975000 close(3) = 0 open("/lib64/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\316\0\0\0\0\0\0"..., 832) = 832 fstat(3, ) = 0 mmap(NULL, 2268928, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fd261535000 mprotect(0x7fd26155a000, 2097152, PROT_NONE) = 0 mmap(0x7fd26175a000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25000) = 0x7fd261750 close(3) = 0 open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \34\2\0\0\0\0\0"..., 832) = 832 fstat(3, ) = 0 mmap(NULL, 3932736, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fd26116d000 mprotect(0x7fd261323000, 2097152, PROT_NONE) = 0 mmap(0x7fd261523000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b6000) = 0x7fd26150 mmap(0x7fd261529000, 16960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fd261529000 close(3) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd26198b000 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd261989000 arch_prctl(ARCH_SET_FS, 0x7fd261989740) = 0 mprotect(0x7fd261523000, 16384, PROT_READ) = 0 mprotect(0x7fd26175a000, 16384, PROT_READ) = 0 mprotect(0x600000, 4096, PROT_READ) = 0 mprotect(0x7fd261986000, 4096, PROT_READ) = 0 munmap(0x7fd261975000, 41031) = 0 ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, ) =0 brk(0) = 0xf60000 brk(0xf81000) = 0xf81000 brk(0) = 0xf81000 stat("/root/.terminfo", 0xf601c0) = -1 ENOENT (No such file or directory) stat("/etc/terminfo", ) = 0 stat("/usr/share/terminfo", ) = 0 access("/etc/terminfo/x/xterm", R_OK) = -1 ENOENT (No such file or directory) access("/usr/share/terminfo/x/xterm", R_OK) = 0 open("/usr/share/terminfo/x/xterm", O_RDONLY) = 3 fstat(3, ) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd261985000 read(3, "\32\0010\0&\0\17\0\235\1l\5xterm|xterm terminal"..., 4096) = 3371 read(3, "", 4096) = 0 close(3) = 0 munmap(0x7fd261985000, 4096) = 0 ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, ) =0 ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, ) =0 ioctl(1, TIOCGWINSZ, ) = 0 fstat(1, ) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd261985000 write(1, "\33[3;J\33[H\33[2J", 12 ) = 12 exit_group(0) = ? +++ exited with 0 +++ 
1

1 Antwort auf die Frage

0
Thomas Dickey

Der Ort, an dem Sie suchen, ist in den erweiterten Funktionen, die mit der -xOption angezeigt werden infocmp, z. B.

infocmp -1x |grep E3 

würde zeigen

 E3=\E[3J, 

(Ich habe die -1Option verwendet, um die Ausgabe als einzelne Spalte zu formatieren). Sie können es wie gewohnt tun

infocmp -x >foo vi foo # remove/adjust whatever sudo tic -x foo 

Beide xtermund linux(Linux-Konsole) unterstützen diese Funktion.

Lesen Sie weiter:

Vielen Dank! Ich habe die Datei bearbeitet und `E3 = \ E [3J,` in `E3 =,` geändert. Ich musste jedoch "linux" aus den "infocmp" -Argumenten entfernen, da die Ausgabe nicht "E3" enthielt. halbeik vor 7 Jahren 0