GNU 화면: -d -m을 사용할 때 이상한 TERMCAP이 나타납니다.

GNU 화면: -d -m을 사용할 때 이상한 TERMCAP이 나타납니다.

실행 방법에 따라 screen올바른 TERMCAP 정보가 있거나 없습니다. 그 증상은 터미널에서 색상이 항상 올바르게 표시되지 않는다는 것입니다(예: ls, vim 구문 강조 표시 등).

이것은 잘 작동합니다:

$ echo $TERMCAP
  <empty output>
$ screen -S foo
$ screen -r foo
  <now I'm inside a screen session>
$ echo $TERMCAP
  <long output>
$ ls
  <nice pretty colors>

여기에 문제가 있습니다.

$ echo $TERMCAP
  <empty output>
$ screen -d -m -S foo
$ screen -r foo
  <now I'm inside a screen session>
$ echo $TERMCAP
  <long output, but different than before>
$ ls
  <no colors ):>

이제 이 문제를 해결할 수 있습니다. TERMCAP 등을 수동으로 수정할 수 있습니다.

하지만 저는 무슨 일이 일어나고 있는지 정말로 이해하고 싶습니다. 가능하다면 "깨끗한" 해결책을 찾고 싶습니다.

무슨 일인지 아는 사람 있나요? -d -m달리면서 사용 하면 어떤 변화가 있을까요 screen?

그것이 중요하다면 이것은 FreeBSD에 있습니다.

답변1

-d -m이 옵션을 사용할 때는 screen다음으로 시작하세요.탁월한이 경우 TERM현재 변수를 기반으로 터미널 설명을 개선하려는 시도가 이루어지지 않습니다. TERM정상적인 시작(분리되지 않음)에서만 변수를 찾습니다 . 분리 모드에서 시작된 세션에 연결하면 초기화를 수행하기에는 너무 늦습니다 TERM.

이 부분16.1 창에 대한 termcap 항목 선택수정 사항 중 일부는 설명서에 설명되어 있습니다.

작동하지 않는 예는 다음과 같습니다.

TERMCAP=SC|화면|VT 100/ANSI X3.64 가상 터미널:\
        :DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:bs:bt=\E[Z:\
        :cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:ct=\E[3g:\
        :do=^J:nd=\E[C:pt:rc=\E8:rs=\Ec:sc=\E7:st=\EH:up=\EM:\
        :le=^H:bl=^G:cr=^M:it#8:ho=\E[H:nw=\EE:ta=^I:is=\E)0:\
        :li#24:co#80:am:xn:xv:LP:sr=\EM:al=\E[L:AL=\E[%dL:\
        :cs=\E[%i%d;%dr:dl=\E[M:DL=\E[%dM:dc=\E[P:DC=\E[%dP:\
        :im=\E[4h:ei=\E[4l:mi:IC=\E[%d@:ks=\E[?1h\E=:\
        :ke=\E[?1l\E>:vi=\E[?25l:ve=\E[34h\E[?25h:vs=\E[34l:\
        :ti=\E[?1049h:te=\E[?1049l:k0=\E[10~:k1=\EOP:k2=\EOQ:\
        :k3=\EOR:k4=\EOS:k5=\E[15~:k6=\E[17~:k7=\E[18~:\
        :k8=\E[19~:k9=\E[20~:k;=\E[21~:F1=\E[23~:F2=\E[24~:\
        :kh=\E[1~:@1=\E[1~:kH=\E[4~:@7=\E[4~:kN=\E[6~:kP=\E[5~ :\
        :kI=\E[2~:kD=\E[3~:ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:

그리고 좋은 것들은 다음과 같습니다:

TERMCAP=SC|화면|VT 100/ANSI X3.64 가상 터미널:\
        :DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:bs:bt=\E[Z:\
        :cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:ct=\E[3g:\
        :do=^J:nd=\E[C:pt:rc=\E8:rs=\Ec:sc=\E7:st=\EH:up=\EM:\
        :le=^H:bl=^G:cr=^M:it#8:ho=\E[H:nw=\EE:ta=^I:is=\E)0:\
        :li#25:co#80:am:xn:xv:LP:sr=\EM:al=\E[L:AL=\E[%dL:\
        :cs=\E[%i%d;%dr:dl=\E[M:DL=\E[%dM:dc=\E[P:DC=\E[%dP:\
        :im=\E[4h:ei=\E[4l:mi:IC=\E[%d@:ks=\E[?1h\E=:\
        :ke=\E[?1l\E>:vi=\E[?25l:ve=\E[34h\E[?25h:vs=\E[34l:\
        :ti=\E[?1049h:te=\E[?1049l:us=\E[4m:ue=\E[24m:so=\E[3m:\
        :se=\E[23m:md=\E[1m:mr=\E[7m:me=\E[m:ms:\
        :Co#8:pa#64:AF=\E[3%dm:AB=\E[4%dm:op=\E[39;49m:AX:G0:\
        :as=\E(0:ae=\E(B:\
        :ac=\140\140aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~..--++,,hhII00:\
        :k0=\E[10~:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[15~:\
        :k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:\
        :F1=\E[23~:F2=\E[24~:kb=^H:K2=\EOE:kB=\E[Z:kh=\E[1~:\
        :@1=\E[1~:kH=\E[4~:@7=\E[4~:kN=\E[6~:kP=\E[5~:kI=\E[2~ :\
        :kD=\E[3~:ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:km:

좋은 경우에는 로 설정되어 있는지 screen확인 하고 해당 설명에서 기능을 추가하세요.TERMxterm

screenFreeBSD에서는 termcap 응용 프로그램에서 가정한 1023바이트 제한으로 설명을 제한할 때 termcap 배포에 색상이 없기 때문에 이 문제를 알 수 있습니다 (추가 설정은 폐기됨). 다른 플랫폼에서는 사용할 수 있습니다.설명하다ncurses에서 제공, 여기서하다컬러 활용법을 알려주세요. 차이점은 사용된 라이브러리 때문이 아닙니다. screen그것은 비록용어 적용, FreeBSD에서 ncurses를 사용합니다:

$ ldd `which screen`
/usr/local/bin/screen:
    libncurses.so.8 => /lib/libncurses.so.8 (0x80086a000)
    libelf.so.1 => /usr/lib/libelf.so.1 (0x800ab6000)
    libutil.so.9 => /lib/libutil.so.9 (0x800ccb000)
    libulog.so.0 => /lib/libulog.so.0 (0x800edd000)
    libcrypt.so.5 => /lib/libcrypt.so.5 (0x8010df000)
    libc.so.7 => /lib/libc.so.7 (0x8012ff000)
    libmd.so.6 => /lib/libmd.so.6 (0x801698000)

대신 차이점은 다음과 같습니다.

  • FreeBSD는 terminfo보다 우선적으로 termcap 데이터베이스를 사용하여 ncurses를 구축합니다(포트를 사용하여 terminfo 데이터베이스를 얻을 수 있습니다).
  • FreeBSD에는 다른 터미널 데이터베이스와 일치하지 않는 termcap 파일이 있습니다. 일부 수정이 이루어졌지만 여전히 다음과 같은 몇 가지 단점이 있습니다.VT100s 색상, 그리고개정하다콘솔과 실제 xterm 사이의 차이를 TERM=xterm덜 분명하게 만듭니다(물론 xterm을 사용하는 사람들은 제외).

다소 아이러니하게도 형식이 여러 줄로 screen설정되어 있음을 알 수 있습니다 TERMCAP. 이는 4.2BSD와 4.3BSD에서 사용되었지만 해시된 데이터베이스를 대신 사용하고 공백도 삭제하여 4.4BSD(약 25년 전)에서 더 이상 사용되지 않습니다(이는 termcap 크기의 1023바이트 제한과 비교됩니다). FreeBSD 이후1990년대에 ncurses로 전환됨, 이 형식은 더 이상 사용되지 않으며 이 TERMCAP변수에 의존하는 애플리케이션은 거의 없습니다. 하지만 ls그것은 그들 중 하나입니다.

screen-T실제로 옵션이 있습니다~해야 한다특정 termcap 항목(색상 포함)을 지정하여 이 문제를 해결하는 데 도움을 주려는 시도가 있지만 테스트해 보면 문제가 해결되지 않는 것 같습니다.

추가 자료:

답변2

글쎄, 거기에 없던 뭔가가 생겼어또한이 문제를 해결하는 데 무엇이 문제인가요?

세션을 생성하는 스크립트 의 screen상단 근처에는 다음이 있습니다.

# This runs the commands:
# TERM=screen
# TERMCAP='...'
# with values appropriate for a 'screen' terminal
eval "$(tset - -s screen | tail -n+2)"

# Set up the SCREENCAP variable, which 'screen' will use for new sessions
SCREENCAP="$TERMCAP"; export SCREENCAP

# ...

screen -d -m -S my-session

my-session이제 터미널 에 연결하면 색상이 작동합니다.

완전히 만족스럽진 않지만 충분히 효과적입니다.

관련 정보