Как изменить поведение ** clear ** на CentOS7 таким образом, чтобы оно не очищало буферы прокрутки на xterm?

493
halbeik

У меня есть виртуальная машина под управлением CentOs 7.2.1511 . Включает курсы 5.9 . Я использую как MobaXterm, так и PuTTY.

Всякий раз, когда я запускаю команду очистки, буферы обратной прокрутки также очищаются автоматически.

Такое поведение не наблюдается в ncurses 5.7 (на другом CentOs VM CentOS выпуск 6.5 (финальный)).

При чтении журнала изменений ncurses было внесено изменение, так что ncurses учитывает «расширенную возможность E3 очищать буфер обратной прокрутки терминала»

Страница man также упоминает terminfo:

В среде он ищет тип терминала, а затем в базе данных terminfo, чтобы выяснить, как очистить экран.

Таким образом, terminfo имеет данные, которые очистка использует для определения того, должен ли он очищать буфер обратной прокрутки терминала. Я нашел утилиту infocmp, которая может распечатывать описания terminfo.

infocmp

НАЗВАНИЕ

 infocmp - compare or print out terminfo descriptions 

Я поместил вывод ниже под деталями.

Запись «clear» в terminfo показывает это «clear = \ E [H \ E [2J,» ».

Когда я запускаю strace clear на CentOS7 VM, я вижу это (полная strace ниже, под подробностями)

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

Когда я запускаю strace clear на CentOS6.5 VM, я вижу это

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

Я думаю, что новая версия clear собирает что-то откуда-то, что говорит, что нужно добавить " \ 33 [3; J ". (Это, вероятно, изменение, о котором говорит журнал изменений)

Но, как говорится на странице руководства; эта информация собирается из terminfo . В моей записи terminfo нет \ 33 [3; J \ 33 [H \ 33 [2J ; скорее он имеет \ 33 [H \ 33 [2J .

Так; если я что-то упустил, и это не ошибка в ncurses 5.9;

Как изменить поведение очистки на Centos7, чтобы НЕ очищать буфер прокрутки?

Я не смотрю ни на изменение кода, ни на компиляцию, ни на замену 5.9 на 5.7.

Спасибо вам всем


Детали :

O / S: CentOS Linux выпуск 7.2.1511 (Core) ncurses: ncurses версия 5.9 (патч 20130511) [получено из 'man clear']

Вывод infocmp на 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, 

следите за чистотой: (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 ответ на вопрос

0
Thomas Dickey

Место для поиска находится в расширенных возможностях, показанных с помощью -xопции infocmp, например,

infocmp -1x |grep E3 

показал бы

 E3=\E[3J, 

(Я использовал -1опцию для форматирования вывода в виде одного столбца). Вы можете, как обычно, сделать

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

Оба xtermи linux(консоль Linux) поддерживают эту функцию.

Дальнейшее чтение:

Thank you very much! I edited the file and changed `E3=\E[3J,` to `E3=,`. However I had to remove `linux` from the `infocmp` arguments as the output didn't include `E3`. halbeik 8 лет назад 0

Похожие вопросы