터미널에서 지원하는 ANSI 이스케이프 코드를 프로그래밍 방식으로 감지합니다.

터미널에서 지원하는 ANSI 이스케이프 코드를 프로그래밍 방식으로 감지합니다.

나는 ANSI 코드를 사용하는 쉘 스크립트를 가지고 놀고 있는데 터미널/OS에 따라 어떤 이유로든 다른 이스케이프 코드가 지원된다는 것을 발견했습니다.

어떤 경우에는 예기치 않게 구문 분석되지 않은 총크 덤프가 발생하는데, 이는 동일한 의미를 여러 곳에서 읽었음에도 불구하고 내 터미널(Mac OS)이 사용된 이스케이프 코드를 지원하지 않는다는 것을 의미한다고 가정합니다.

27 = 033 = 0x1b = ^[ = \e

검색하다가 발견한슬래시 이스케이프 지원 감지에 관한 이 질문.

선택된 답변은 $TERM감지할 값을 스니핑합니다.

case $TERM in
  (|color(|?))(([Ekx]|dt|(ai|n)x)term|rxvt|screen*)*)
    PS1=$'\e\]0;$GENERATED_WINDOW_TITLE\a'"$PS1"
esac

그런데 그게 얼마나 믿을 만한지 궁금하네요.

이스케이프 코드 지원(주로 Bash용)을 확인하는 표준 방법이 있습니까? 아니면 해당 스크립트가 거의 일반적인 작업입니까?

  • 또는 가장 광범위한 지원을 '보장'하기 위해 어떤 이스케이프 코드를 사용할 수 있습니까?
  • echo 확장 -e는 어떻습니까?
  • 이식성/가용성/배포 측면에서 일반적인 모범 사례는 무엇입니까?스크립트제어 코드를 사용하거나 참조합니까?

이것은역시 잘 읽었어정보를 찾는 다른 사람을 위해.

답변1

특정 작업을 염두에 두셨나요?

다음은 사용 예입니다.눈에 띄는 모드, 많은 터미널에서 강력한 가시적 결과를 제공합니다.

tput smso; echo hello, world; tput rmso

도구 는 환경 변수 tput의 값을 사용하여 $TERM출력할 이스케이프 시퀀스(있는 경우)를 결정합니다. 예를 들어

TERM=xterm
( tput smso; echo hello, world; tput rmso ) | hexdump -C
00000000  1b 5b 37 6d 68 65 6c 6c  6f 2c 20 77 6f 72 6c 64  |.[7mhello, world|
00000010  0a 1b 5b 32 37 6d                                 |..[27m|

TERM=dumb
( tput smso; echo hello, world; tput rmso ) | hexdump -C
00000000  68 65 6c 6c 6f 2c 20 77  6f 72 6c 64 0a           |hello, world.|

흥미로운 특성 쌍은 다음에서 찾을 수 있습니다.man 5 terminfo, 그 중 일부는 다음과 같습니다.

  • 눈에 띄는 : smso그리고rmso
  • 밑줄: smulrmul
  • 깜박임(예!):blink
  • 이중폭: swidmrwidm
  • 뒤집다:rev
  • 모두 취소:sgr0

굵은 텍스트를 쓰고 싶지만 터미널이 이를 이해하는 경우에만 다음과 같은 코드 조각이 작동합니다.

boldOn=$(tput smso)
boldOff=$(tput rmso)
# ...
printf "%s%s%s\n" "$boldOn" 'This message will be in bold, when available' "$boldOff"

답변2

실제로 DEC 터미널(및 xterm을 포함한 클론 및 에뮬레이션)의 기능에 대해 문의하는 것이 가능합니다. 개별 이스케이프 시퀀스 지원(또는 그 완전성)에 관한 것이 아닙니다. UNIX는 일반적으로 이 기능을 사용하지 않으며 termcap/terminfo 데이터베이스(특이점도 문서화함)에 의존합니다.

참고로 시퀀스는 DA("Device Attributes", ANSI 표준) 및 DECID("Identify Terminal", DEC private)입니다.

관련 정보