저는 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
- 밑줄:
smul
및rmul
- 윙크(예!):
blink
- 이중 너비:
swidm
및rwidm
- 취소:
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 Attribute", ANSI 표준) 및 DECID("식별 터미널", DEC private)입니다.