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.