bash 명령을 사용하여 터미널에 UTF-8 기호를 인쇄하는 방법.
이게 효과가 있어
echo -e '\U2586'
그러나 다음은 실패합니다
printf '%s\n' $(tput setaf 118) "\\u2586" $(tput sgr0)
답변1
printf
Bash에서 형식 문자열 뒤에 오는 매개변수에서 백슬래시 이스케이프 시퀀스를 확장 하려면 다음 을 수행해야 합니다.사용%b
%s
형식 문자열 대신 :
printf '%b\n' "$(tput setaf 118)" "\u2586" "$(tput sgr0)"
세 가지 인수가 있으므로 아마도 이것이 더 적절할 수 있습니다.
printf '%s%b%s\n' "$(tput setaf 118)" "\u2586" "$(tput sgr0)"
~처럼스티븐 차제라스이는 현재 로케일의 문자 세트에서 U+2586 문자의 인코딩을 출력합니다. UTF-8인 경우 결과는 UTF-8입니다. 다른 문자 세트는 다양합니다. 문자 세트가 U+2586을 나타낼 수 없는 경우 결과는 "\u2586" 문자열이 됩니다(zsh는 "범위에 없는 문자" 오류와 함께 실패합니다).
이렇게 하면 대부분의 경우 원하는 동작이 생성됩니다. 가능하면 "▆"가 표시됩니다. 만약 너라면진짜문자의 UTF-8 표현을 출력하려면 모든 경우에 로케일을 재정의하여 이를 강제할 수 있습니다.예를 들어
LC_ALL= LC_CTYPE=en_US.UTF-8 printf '%s%b%s\n' "$(tput setaf 118)" "\u2586" "$(tput sgr0)"
(바라보다LANG=C와 LC_ALL=C의 차이점은 무엇입니까?위에서 사용된 변수 설정에 대한 참고 사항입니다. )
답변2
\uxxxx
및에 대한 지원은 2000년에 독립 실행형 유틸리티의 GNU 구현 \UXXXXXXXX
에 처음 추가되었지만 다른 이스케이프 시퀀스와 마찬가지로 형식 인수나 지정자의 인수에서만 인식됩니다. 문자열을 그대로 표시하는 데 사용되지 않습니다 .printf
%b
%s
printf
나중에 2003년에 내장 기능 ( / 및 There zsh
에도 해당 ), 2004년에 ksh93, 2010년에 bash(4.2) 에 추가되었으며 그 이후로 아마도 몇 가지 내장 기능이 더 추가되었을 것입니다.echo
print
$'...'
그러나 이것은 표준이 아닙니다. 계획이 있다POSIX는 $'...'
ksh93의 인용 형식을 지정합니다.\u
/ 시퀀스를 허용 \U
하지만 현재 문제 중 하나는 이러한 따옴표를 사용하는 명령을 구문 분석 및/또는 실행할 때 현재 로캘의 문자 집합이 UTF-8이 아닌 경우 확장을 처리하는 방법입니다.
그럼에도 불구하고 스크립트가 UTF-8 문자 세트를 사용하는 로케일에서 시작되고 그 이후 )LC_CTYPE
변수로LC_ALL
LANG
$'\uxxxx'
$'\UXXXXXXXX'
코드 포인트가 0xFFFF보다 높은 문자 에 사용됩니다 . 일부 쉘에는 4자리 숫자 \u
와 8자리 숫자가 모두 필요합니다 \U
. 따라서 이식성을 극대화하려면 또는 를 사용하세요 $'St\u00E9phane'
. 필요한 모든 쉘에서는 16진수이므로 16진수로 처리됩니다. 지원되는 셸의 경우 또는를 사용하고 따옴표 연산자를 혼합하여 일치시킬 수도 있습니다.$'St\U000000E9phane'
Stéphane
St\u00E9fan
Stéfan
$'St\ue9fan
St
\U0E9F
ane
f
$'\ue9'
$'St\ue9'$'fan'
St$'\ue9'fan
printf
그런 다음 이러한 확장을 모든 명령 이나 다른 명령 에 전달할 수 있습니다 .
특별한 경우에는 zsh
의 print
내장 기능을 사용할 수 있습니다.
print -P '%F{118}\u2586%f'
-P
명령을 실행하지 않고도 프롬프트 확장이 전경색을 설정할 수 있게 해줍니다 tput
. 또는:
print -rP '%F{118}'$'\u2586''%f'
여기서 이스케이프 시퀀스를 비활성화하고 따옴표를 사용하여 -r
문자 그대로 U+2586 문자를 전달합니다 .print
$'...'
또는:
arbitrary_text=$'\u2586'' arbitrary text with \backslash and % characters'
print -r -- ${(%):-%F{118}}$arbitrary_text${(%):-%f}
확장은 수행되지 않지만 인수 확장 플래그 print
에 의해 색상 이스케이프 시퀀스가 생성되고 %
U+2586이 변수에 그대로 저장됩니다. 인쇄-r