TERM 환경 변수 기본값은 어디에 설정됩니까?


26

데스크탑 GUI에서 그놈 터미널 에뮬레이터로 터미널 창을 열면 쉘 TERM 환경 변수의 기본값이 값으로 설정 xterm됩니다.

CTL+ ALT+ F1를 사용 하여 콘솔 TTY 창으로 전환 echo $TERM하면 값이로 설정됩니다 linux.

묻는 동기는 ~/.bashrc파일 내 에서 변수가 색상 쉘이 제공되는지 아니면 구식 흑백인지를 결정하는 데 사용된다는 것입니다.

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color) color_prompt=yes;;
esac

내가 입력하면 콘솔 쉘과 그놈 터미널 에뮬레이터 쉘에서

export TERM=xterm-color
source /.bashrc

두 껍질 모두 색상 모드로 변경됩니다 (항상 두 가지 모두에서 발생하고 싶음).

기본값은 어디에서 TERM설정하고 가능한 경우 기본값을 변경하기에 가장 좋은 위치는 어디입니까? 터미널 에뮬레이터 GUI에는 기본 TERM 값을 선택하거나 설정할 것이 없습니다.

나는 파일 export TERM=xterm-color의 맨 위에 줄 을 추가하는 것을 고려 ~/.bashrc했지만 내 직감은 이것이 최선의 해결책이 아니며 Google 검색으로 아직 좋은 대답을 얻지 못했다고 말합니다.

Ubuntu 15.04 Desktop Edition (Debian Based)을 실행 중입니다.


답변:


17

많은 장소에서

가상 터미널과 실제 터미널에서 TERM환경 변수는에 연결되는 프로그램에 의해 설정되며, login로그온 한 후에 실행되는 대화식 쉘과 함께 상속됩니다. 정확하게 이런 일이 발생하는 곳은 시스템마다 다르며 터미널의 종류에 따라 다릅니다.

실제 직렬 단자는 전선의 다른 쪽 끝에있는 내용에 따라 유형이 다를 수 있습니다. 따라서 일반적으로 getty프로그램은 터미널 유형을 지정하는 인수로 호출되거나 TERM서비스 관리자의 서비스 구성 데이터에서 프로그램으로 전달 됩니다.

  • van Smoorenburg init시스템에서는 /etc/inittab항목에서 이것을 볼 수 있습니다.

    S0 : 3 : 부활 : / sbin / agetty ttyS0 9600 vt100-nav
    agetty해당 행 의 마지막 인수는 에 vt100-nav설정된 터미널 유형입니다 /dev/ttyS0. 따라서 /etc/inittab그러한 시스템에서 실제 터미널의 터미널 유형을 변경하는 위치도 있습니다.
  • 시스템 시스템의 경우 /usr/lib/systemd/system/serial-getty@.service단위 파일 ( /lib/systemd/system/serial-getty@.service병합되지 않은 시스템) 에서이 내용을 볼 수 있습니다.

    환경 = TERM = vt100
    TERM전달 된 환경 에서 변수를 설정합니다 agetty. 이 서비스 단위 파일은 이러한 시스템에서 실제 터미널의 터미널 유형을 변경하는 위치입니다. 이 서비스 단위 템플릿을 사용하는 모든 실제 터미널에 적용됩니다 . 개별 터미널에 대해서만 변경하려면 템플릿을 수동으로 인스턴스화해야합니다.
  • BSD init에서 /etc/ttys데이터베이스 에있는 각 터미널 항목의 세 번째 필드에서 터미널 유형을 가져 TERM와서 실행하는 환경에서 설정합니다 getty. 그러므로 /etc/ttys하나가 BSD의 진짜 단말기의 단말기 유형 변경 곳이다.

앞서 언급했듯이 커널 가상 터미널에는 고정 유형이 있습니다. 커널 가상 터미널 유형을 즉시 변경할 수있는 NetBSD와 달리 Linux 및 기타 BSD에는 커널의 내장 터미널 에뮬레이션 프로그램에서 단일 고정 터미널 유형이 구현되어 있습니다. Linux에서 해당 유형 linux은 terminfo 데이터베이스 와 일치 합니다. (FreeBSD의 커널 터미널 에뮬레이션은 xterm버전 9부터 제한된 하위 집합입니다.)

  • mingetty또는 vc-get-ttynosh 패키지를 사용하는 시스템 에서 프로그램은 가상 터미널과 만 통신 할 수 있음을 "인식"하고 프로그램이 컴파일 된 운영 체제에 적합한 "알려진"가상 터미널 유형을 고정 배선합니다.
  • 시스템 시스템의 경우 /usr/lib/systemd/system/getty@.service단위 파일 ( /lib/systemd/system/getty@.service병합되지 않은 시스템) 에서이 내용을 볼 수 있습니다.

    환경 = TERM = 리눅스
    TERM전달 된 환경 에서 변수를 설정합니다 agetty.

커널 가상 터미널의 경우 터미널 유형을 변경 하지 않습니다 . 커널의 터미널 에뮬레이터 프로그램은 결국 변경되지 않습니다. 유형을 변경하는 것은 올바르지 않습니다 . 특히, 이것은 커서 / 편집 키 CSI 시퀀스 인식을 방해합니다. linux리눅스 커널 터미널 에뮬레이터가 보낸 CSI 시퀀스는 서로 다른 있습니다 xterm또는 vt10012월 VT 모드에서 GUI 터미널 에뮬레이터 프로그램에 의해 전송 된 CSI 시퀀스.

GUI 터미널 에뮬레이터는 SSH screen터미널부터 의사 터미널을 사용 하는 많은 프로그램 중 하나입니다 . 터미널 유형은 의사 터미널의 마스터 측에서 실행중인 터미널 에뮬레이터 프로그램 및 구성 방법에 따라 다릅니다. 대부분의 GUI 터미널 에뮬레이터는 슬레이브 쪽에서 TERM마스터 쪽의 터미널 에뮬레이션과 값 이 같은 변수를 사용하여 프로그램을 시작합니다 . SSH 서버와 같은 프로그램은 연결의 클라이언트쪽에있는 터미널 유형을 "통과"하려고 시도합니다. 일반적으로 터미널 에뮬레이션 중에서 선택할 수있는 일부 메뉴 또는 구성 옵션이 있습니다.

쥐는 손

색상 기능을 감지하는 올바른 방법은 스크립트에서 터미널 유형 목록을 고정하는 것이 아닙니다 . 색상을 지원하는 수많은 터미널 유형이 있습니다.

올바른 방법은 터미널 유형에 대해 termcap / terminfo가 무엇을 말하는지 보는 것입니다.

색상 = 0
tput Co> / dev / null 2> & 1 인 경우
그때
    "tput Co`"테스트 -gt 2 && colour = 1
elif tput colors> / dev / null 2> & 1
그때
    "입력 색상"테스트 -gt 2 && colour = 1
fi

추가 자료

  • Jonathan de Boyne Pollard (2018). TERM. nosh 가이드 . 소프트웨어.

다음은 Debian jessie의 기본 .bashrc에 [ -x /usr/bin/tput ] && /usr/bin/tput setaf 1 >&/dev/null && color_prompt=yes있습니다. (5.9 ncurses)
thom_nic

2
tput CoJessie 및 Xenial에서 "알 수없는 terminfo 기능" 도 반환합니다. tput colors그리고 tput setaf 1내가 이해하지 못하는 인정하지만 모두 제대로 작동 하는 이유 .
thom_nic

2

내가 왜 잘못된 접근법 이라고 생각 하고 Ubuntu 가 더 이상 사용되지 않는지에 대한 자세한 답변 은 https://askubuntu.com/a/614714/398785 를 참조 하십시오 . 나는 당신이 (gnome-terminal 3.16 이후의 기본값이지만, 오래된 gnome-terminal과 함께 사용하기에 안전합니다)를 사용하고 그에 따라 조정하는 것이 좋습니다.TERM=xterm-color.bashrcTERM=xterm-256color.bashrc


1
링크 +1 사소한 제안; 다음 문장은 혼란 스러울 수 있습니다 (처음에는 사용 .bashrc이 더 이상 사용 되지 않는다는 인상을 받았습니다 ). "우분투의 .bashrc는 더 이상 사용되지 않습니다."
IsaacS

@IsaacS 개선 방법에 대한 제안이 있습니까? 예를 들어 "구식"을 "오래된"도움말로 대체 하시겠습니까?
egmont

1
우분투 18.04에서 이와 같은 레이아웃을 엉망으로 xterm-256color만드는 것으로 보입니다 . htop
Monica Harming

@OrangeDog 어떤 터미널 에뮬레이터에서? 이 질문에 대한 답변은 그놈 터미널에 중점을 둔 반면 링크 한 페이지에는 Konsole이 표시됩니다. 이 버그는 터미널 에뮬레이터가 아직 ncurses가 그 시간에 사용하기 시작한 REP 이스케이프 시퀀스를 지원하지 않는 것 같습니다. VTE (GNOME Terminal)는 이미 Ubuntu 18.04에서 지원을 추가했지만 Konsole이 지원하지 않았을 가능성이 있습니다. 나는 htop 파손에 대한 귀하의 의견이 Konsole에는 유효하지만 그놈 터미널에는 유효하지 않다고 생각합니다.
egmont

@egmont는 원래 문제에 대해 말할 수는 없지만 WSL의 터미널 (무엇이든)과 동일한 결과를 얻습니다.
Monica Harming
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.