최근 디스크 오류로 인해 서버를 다시 설치했으며 이제 터미널 크기 조정에 문제가 있습니다. 데비안 6.0.6을 설치했습니다.
조짐
터미널 크기를 조정할 때 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
.
시도해도 kill -s SIGWINCH $$
$ COLUMNS / $ LINES 변수가 업데이트되지 않습니다.
checkwinsize
( shopt -s checkwinsize
)를 활성화 하면 bash가 응용 프로그램에서 반환 될 때 예상대로 $ COLUMNS / $ LINES를 업데이트합니다. checkwinsize
활성화 된 터미널의 크기를 조정 한 후 다음과 같은 결과가 나타납니다 .
$ echo $COLUMNS ; ls > /dev/null ; echo $COLUMNS
72
107
로그인 쉘을 tcsh와 같은 것으로 변경하고 터미널 크기를 조정하려고 시도하면 테스트 한 다른 상자의 bash와 마찬가지로 예상대로 작동합니다.
.bashrc를 제거하려고 시도했지만 아무것도하지 않았습니다. 이 문제는 PuTTY 및 Linux 상자의 일종의 rxvt 유형 터미널 모두에서 다양한 bash 구성을 가진 다른 여러 사용자에게 발생합니다.
strace
나는 bash에서 strace를 실행하고 터미널 크기 조정을 시도했지만 아무것도 통과하지 못했습니다 ( read
프롬프트를 인쇄 한 직후 호출에서 차단 된 상태로 유지 됨 ).
나는 빈 줄에 돌아 왔고 bash는 많은 일을했습니다. 내가 관련 있다고 생각하는 출력은 다음과 같습니다 (( 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], [WINCH], 8) = 0
4: write(2, "aa:~$ ", 6) = 6
5: rt_sigprocmask(SIG_SETMASK, [WINCH], NULL, 8) = 0
6: rt_sigprocmask(SIG_BLOCK, NULL, [WINCH], 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, [], NULL, 8) = 0
2: rt_sigaction(SIGWINCH, {0x49e320, [], SA_RESTORER|SA_RESTART, 0x7f7ef49f64c0}, {0x457880, [], SA_RESTORER, 0x7f7ef49f64c0}, 8) = 0
3: rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
4: write(2, "aaaaaaa:~$ ", 11) = 11
5: rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
6: rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
7: read(0,
질문
도대체 무슨 일이 일어나고 왜 내 배쉬가 깨졌습니까? :(
어딘가에 예상치 못한 옵션이있을 수 있지만 Google의 몇 시간 동안 아무것도 켜지지 않았습니다.
어떤 도움이나 조언을 주시면 감사하겠습니다. 정말 실망 스럽습니다.
감사합니다.
exec bash
와 exec bash -l
같은 동작을 나타낸다. 나는 이것이 혼자가 아니라 작은 위안이라고 생각합니다. 그러나이 원인에 대해서는 혼란 스럽습니다. 콜로는 새로 다운로드 한 데비안 이미지에서 최소 설치를 설치했습니다. 로컬로 설치를 시도하고 문제가 있는지 확인하고 (다른 사람에게는 발생하지 않는 것으로 가정하므로) 실행중인 시스템과 비교를 시작하십시오.
/etc/bash.bashrc
모든 파일 /etc/profile
과 /etc/profile.d
파일은 변경되지 않았습니다. bash 소스 ( apt-get source bash
)를 다운로드했으며 소스를 ./configure
파기 전에 문제를 좁히기 위해 다양한 주장을 하고 있습니다.
--disable-readline --enable-minimal-config --disable-job-control
하고 strace를 실행하여 어떤 파일인지 확인하고 open
모든 파일의 이름을 바꾼 다음 다시 로그인했습니다. 같은 문제입니다. 나는 bash 자체를 사용하여 구성 변경을 거의 배제했습니다.
exec bash
이 손으로 (그래서 더 이상 로그인 쉘이 아님) 여전히 오작동합니까? 그렇지 않은 경우는exec bash -l
어떻습니까 (그래서 로그인 쉘)? 그렇다면 로그인 스크립트 (/etc/profile
/etc/profile.d/
~/.bash_profile
~/.profile
)에 문제가 있지만 쉘에하지 말아야 할 것을 알 수있는 것을 알지 못합니다SIGWINCH
.