症状
当您调整终端大小时,没有基于ncurses的应用程序(已测试:ytalk,iRSSi,screen,tmux,某些ncurses示例应用程序)似乎正确调整大小.屏幕通常最终为空白.在应用程序中强制重绘将使用旧的终端大小重绘.
在bash(4.1.5(1))提示符下调整窗口大小时,COLUMNS和LINES变量永远不会更新.
诊断
试图在bash中捕获SIGWINCH,它似乎永远不会被接收.测试结果如下:
trap 'touch /home/user/sigwinch' SIGWINCH trap 'touch /home/user/sigusr1' SIGUSR1 kill -s SIGWINCH $$ kill -s SIGUSR1 $$
哪个应该在我的主目录中创建这两个文件.它只创建了/ home / user / sigusr1.
试图杀死-s SIGWINCH $$不会导致更新$COLUMNS / $LINES变量.
启用checkwinsize(shopt -s checkwinsize)将导致bash在从任何应用程序返回时更新$COLUMNS / $LINES(如预期的那样).调整启用了checkwinsize的终端后,会出现以下情况:
$echo $COLUMNS ; ls > /dev/null ; echo $COLUMNS 72 107
将我的登录shell更改为类似tcsh并尝试调整终端的大小可以正常工作,就像我测试的其他盒子上的bash一样.
我尝试删除我的.bashrc并没有做任何事情.对于PuTTY和Linux机箱中的某种rxvt类型终端中具有不同bash配置的其他几个用户,会出现此问题.
strace的
我在bash上运行strace并试图调整终端的大小,没有任何结果(在打印提示后它立即在读取调用时被阻止).
我在一条空线上回击,而bash做了很多东西.我认为相关的输出是:(full strace)
1: rt_sigprocmask(SIG_SETMASK,[WINCH],NULL,8) = 0 2: rt_sigaction(SIGWINCH,{0x80e2c20,[],SA_RESTART},{0x809c310,0},8) = 0 3: rt_sigprocmask(SIG_BLOCK,[INT],8) = 0 4: write(2,"aa:~$",6) = 6 5: rt_sigprocmask(SIG_SETMASK,8) = 0 6: rt_sigprocmask(SIG_BLOCK,8) = 0 7: read(0,
根据我的理解,这显示了bash :(我可能会误解这个.我在这里已经超出了我的元素.)
1: Disabling delivery of the SIGWINCH signal,when prevIoUsly it was allowed. 2: Registering a handler for the SIGWINCH signal. 3: Masking some other combination of signals. As evidenced by line 5,this does not include SIGWINCH. 4: Printing the prompt. 5: Masking SIGWINCH,where prevIoUsly nothing was blocked. 6: Masking the "union of null and SIGWINCH" which,to my understanding,would result in SIGWINCH being masked. 7: Waiting on input.
在没有这些问题的盒子上执行相同的strace(Ubuntu,bash 4.2.24(1))导致:
1: rt_sigprocmask(SIG_SETMASK,{0x49e320,SA_RESTORER|SA_RESTART,0x7f7ef49f64c0},{0x457880,SA_RESTORER,"aaaaaaa:~$",11) = 11 5: rt_sigprocmask(SIG_SETMASK,8) = 0 7: read(0,
题
到底是怎么回事,为什么我的打击被打破了?