ANSI-C 인용을 지원하는 쉘은 무엇입니까? 예를 들어 $'문자열'

ANSI-C 인용을 지원하는 쉘은 무엇입니까? 예를 들어 $'문자열'

다음 명령을 사용하여 출력에 녹색 확인 표시를 인쇄하는 쉘 스크립트가 있습니다.

col_green="\e[32;01m"
col_reset="\e[39;49;00m"

echo -e "Done ${col_green}✓${col_reset}"

배쉬를 읽은 후ANSI-C 인용문, 색상 변수를 설정할 때 이를 사용할 수 있다는 것을 깨달았습니다 -e.에코.

col_green=$'\e[32;01m'
col_reset=$'\e[39;49;00m'

echo "Done ${col_green}✓${col_reset}"

이는 메시지가 Bash의 내장 기능으로 전달되는지 여부에 관계없이 올바르게 인쇄된다는 의미이므로 매력적으로 보입니다.에코또는 외부 유틸리티 /bin/echo(저는 macOS를 사용하고 있습니다).

하지만 이로 인해 스크립트의 이식성이 떨어지나요? Bash와 Zsh가 이 인용 스타일을 지원한다는 것은 알고 있지만 다른 것들은 잘 모르겠습니다.

답변1

$'…'zsh, bash, mksh, FreeBSD sh 및 BusyBox sh의 일부 버전에도 존재하는 ksh93 기능입니다(BusyBox ash는 이를 사용하여 구축됨 ENABLE_ASH_BASH_COMPAT). POSIX sh 언어에는 아직 존재하지 않습니다. 대시( /bin/shUbuntu 등에서는 기본적으로), ksh88, Bourne 쉘, NetBSD sh, yash, mksh를 제외한 pdksh 파생물 및 BusyBox의 일부 버전을 포함한 일반적인 Bourne 유사 쉘에는 이 기능이 없습니다 .

백슬래시 문자와 백슬래시 8진수를 제어 문자로 구문 분석하는 이식 가능한 방법은 다음을 사용하는 것입니다.printf. 모든 POSIX 호환 시스템에 존재합니다.

esc=$(printf '\033') # assuming an ASCII (as opposed to EBCDIC) system
col_green="${esc}[32;01m"

휴대가 불가능 하니 주의하세요 \e. 많은 구현이 이를 지원 printf하지만 dash1의 구현은 지원하지 않습니다. 대신 8진수 코드를 사용하세요.

¹Debian Stretch 및 Ubuntu 17.04로 시작하는 Debian 및 최소 버전 0.5.8-2.4의 파생 버전에서 지원됩니다.

답변2

$'...'이식 시 지지 수준도 고려해야 합니다. 이것POSIX Folks는 이것을 POSIX sh에 넣을 것을 제안했습니다.특히 하나:

스테판: ksh93은 쉘 $'...'입니다(while $'\uxxxx'[그리고$'\Uxxxxxxxx'] zsh에서:http://www.zsh.org/mla/workers/2003/msg00223.html) [^]

내가 Debian Bullseye에서 얻은 내용을 보면 이것이 이 새로운 배포판에서 얻을 수 있는 유일한 "공식" Korn 쉘이라는 것을 ksh2020이해할 수 있습니다 .$'\U1F600'

mksh구문 분석했지만 U+FFFE로 완전히 엉망이 되었습니다. 구문 오류에 대해 불평하지 않으므로 유니코드에 대한 이해에 문제가 있는 것 같습니다. $'\U01F60'아주 잘 처리됩니다 .

관련 정보