Questão Como eu mudo o comportamento do ** clear ** no CentOS7 de tal forma que ele NÃO irá limpar os buffers de rolagem no xterm?


Eu tenho uma VM rodando CentOS 7.2.1511. Inclui ncurses 5.9. Eu uso o MobaXterm e o PuTTY.

Sempre que eu corro o Claro comando, os buffers de rolagem são limpos automaticamente também.

Esse comportamento não é observado em ncurses 5.7 (em outro CentOS VM CentOS versão 6.5 (final)).

Lendo o changelog do ncurses, foi feita uma alteração para que o ncurses leve em conta "a capacidade estendida do E3 para limpar o buffer de rolagem do terminal"

A página man também menciona terminfo:

Ele procura no ambiente pelo tipo de terminal e, em seguida, banco de dados terminfo para descobrir como limpar a tela.

assim terminfo tem dados que Claro usa para determinar se deve limpar o buffer de rolagem do terminal. Eu encontrei um utilitário infocmp, que pode imprimir descrições de terminfo.

infocmp 

NOME

   infocmp - compare or print out terminfo descriptions

Eu coloquei a saída abaixo sob detalhes.

A entrada "clear" no terminfo mostra isso "clear = \ E [H \ E [2J,".

Quando eu corro strace claro no CentOS7 VM eu vejo isso (full strace está abaixo, sob detalhes)

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

Quando eu corro strace claro no CentOS6.5 VM eu vejo isso

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

Eu acho que a nova versão do Claro está pegando algo de algum lugar que está dizendo para preceder "\ 33 [3; J". (Essa é provavelmente a mudança que o changelog fala)

Mas como a página do homem afirmou; essa informação é recolhida a partir de terminfo. Minha entrada clear terminfo não tem 33, 33 e 33 [H, 33; em vez disso, tem \ 33 [H \ 33 [2J.

Assim; se estou faltando alguma coisa e isso não é um bug no ncurses 5.9;

Como eu mudo o comportamento de Claro no Centos7 para não limpar o buffer de rolagem?

Eu não estou olhando para modificar o código e compilar, nem substituir 5.9 com 5.7.

Obrigado a todos


Detalhes:

O / S: versão CentOS Linux 7.2.1511 (Core) ncurses: ncurses versão 5.9 (patch 20130511) [recuperado de 'man clear']

Saída de infocmp no 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%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,
        setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%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, {st_mode=S_IFREG|0644, st_size=41031, ...}) = 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, {st_mode=S_IFREG|0755, st_size=174520, ...}) = 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, {st_mode=S_IFREG|0755, st_size=2107816, ...}) = 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, {B38400 opost isig icanon echo ...}) =0
brk(0)                                  = 0xf60000
brk(0xf81000)                           = 0xf81000
brk(0)                                  = 0xf81000
stat("/root/.terminfo", 0xf601c0)       = -1 ENOENT (No such file or directory)
stat("/etc/terminfo", {st_mode=S_IFDIR|0755, st_size=6, ...}) = 0
stat("/usr/share/terminfo", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 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, {st_mode=S_IFREG|0644, st_size=3371, ...}) = 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, {B38400 opost isig icanon echo ...}) =0
ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) =0
ioctl(1, TIOCGWINSZ, {ws_row=62, ws_col=112, ws_xpixel=896, ws_ypixel=930}) = 0
fstat(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 0), ...}) = 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


origem




Respostas:


O lugar para olhar está no estendido capacidades, mostrado usando o -x opção de infocmp, por exemplo.,

infocmp -1x |grep E3

mostraria

    E3=\E[3J,

(Eu usei o -1 opção para formatar a saída como uma única coluna). Você pode, como de costume,

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

Ambos xterm e linux (Console Linux) suporta esse recurso.

Leitura adicional:


0



Muito obrigado! Eu editei o arquivo e mudei E3=\E[3J, para E3=,. No entanto, eu tive que remover linux de infocmp argumentos como a saída não incluiu E3. - halbeik