Bash 및 Zsh 이외의 쉘이 ANSI-C 인용을 지원합니까? 예 : $ 'string'


13

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

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

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

Bash의 ANSI-C Quoting 에 대해 읽은 후 색상 변수를 설정할 때 사용할 수 -e있고 echo 에서 플래그를 제거 할 수 있음을 깨달았습니다 .

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

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

이것은 메시지가 Bash의 내장 에코 또는 외부 유틸리티 /bin/echo(MacOS에 있음)로 전달되는지 여부에 따라 메시지가 올바르게 인쇄된다는 것을 의미하기 때문에 매력적 입니다.

그러나 이것이 스크립트의 이식성을 떨어 뜨립니까? Bash와 Zsh가 이러한 스타일의 인용을 지원한다는 것을 알고 있지만 다른 것에 대해서는 잘 모르겠습니다.


그렇습니다 .ksh와 그 변형 만 지원하기 때문입니다. 그러나 IIRC, ANSI-C 인용은 다음 POSIX 사양에있을 것입니다.
cuonglm 2016 년

답변:


12

$'…'ksh93 기능은 zsh, bash, mksh, FreeBSD sh 및 BusyBox sh (BusyBox ash로 빌드)의 일부 빌드에도 ENABLE_ASH_BASH_COMPAT있습니다. POSIX sh 언어로는 아직 존재하지 않습니다. 일반적인 Bourne과 같은 쉘에는 대시 ( /bin/sh우분투에 기본적으로 있음), ksh88, Bourne 쉘, NetBSD sh, yash, mksh 이외의 pdksh 파생물 및 BusyBox 빌드가 포함됩니다.

제어 문자로 구문 분석 된 백 슬래시 문자와 백 슬래시-옥탈을 가져 오는 휴대용 방법은을 사용하는 것 printf입니다. 모든 POSIX 호환 시스템에 있습니다.

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

그 주 \e이식 할 수 없습니다. 그것은 많은 구현에서 지원 printf되지만 dash¹에서는 지원 되지 않습니다. 8 진수 코드를 대신 사용하십시오.

¹ 데비안 스트레치 및 우분투 17.04 이후로 최소 0.5.8-2.4를 제공하는 데비안 및 파생 제품에서 지원됩니다.


당신이 있는지에 대한 있습니다 \e에서 지원되지 dash? 여기에 굵은 빨간색으로 dash -c 'printf "\e[1;31m"; type printf; printf "\e[m"'인쇄 printf is a shell builtin됩니다 (대시 -0.5.8). 지원하지 않는 쉘 \eyash입니다.
mosvy

@mosvy \e[1;31mprintf is a shell builtin \e[m여기에서 인쇄 합니다. 우분투 16.04, 대시 0.5.8-2.1 우분투 2. 대시 0.5.8-2.10과 함께 우분투 18.04에 빨간색으로 인쇄합니다. 우분투가 그것을 지원하기 위해 패치를 만든 것 같습니다.
Gilles 'SO- 악마 그만해

네, 죄송합니다. 데비안 (9.7 스트레치) 패치 인 것 같습니다. 여기는 원본입니다.
mosvy

0

$'...'포팅 할 때도지지 정도 를 고려해야합니다. POSIX 쉬에 넣고하는 POSIX의 밥상 '제안은 특히 하나 언급 :

stephane : ksh93은 쉘 $ '...'에서 온 것입니다 ( $'\uxxxx'[ $'\Uxxxxxxxx' ]는 zsh에서 온 것입니다 : http://www.zsh.org/mla/workers/2003/msg00223.html ) [^]

ksh2020AT & T 의 데비안 불즈 아이에서 내가 얻은 내용을 이해 $'\U1F600'합니다. 이것은이 새로운 배포판에서 얻을 수있는 유일한 "공식적인"Korn 쉘입니다.

mksh파싱했지만 U + FFFE로 완전히 botched. 구문 오류에 대해 불평하지 않았으므로 유니 코드를 이해하는 데 문제가 있습니다. 잘 처리 $'\U01F60'됩니다.


불행히도, 최근 쿠데타 의 영향으로 ksh2020이 사라졌습니다. 그러나 그렇습니다. 원래 ksh93은 지원 $'...'했으며 iirc는 처음으로 수행했습니다.
mosvy

@ Arthur2e5. ksh2020AT & T 출신이 아닙니다. 레드햇에서 사람들의 몇 가지, 하나는, 기본적으로 몇 년 전 AT & T AST github의 트리를 납치하고 미래의 제어 주장 ksh93개발
fpmurphy을
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.