tput을 사용하여 빨간색을 정의했습니다.
red=$(tput setaf 1)
내 프로그램에서 경고 색상을 지정합니다. 이것은 잘 작동합니다:
printf '%sfail\n' "$red"
# prints 'fail' in red
하지만 한 번은 이스케이프 시퀀스를 있는 그대로 인쇄하고 싶습니다. 예를 들면 다음과 같습니다.
\E[31m 실패
어떻게 해야 합니까? printf에 대한 플래그 가 있다는 것을 알고 있지만 %q
이스케이프하고 싶지 않은 다른 것을 이스케이프합니다.
답변1
문자 그대로 인쇄하는 대신 이러한 이스케이프 문자를 \E
또는 \033
, ^[
... 과 같은 인쇄 가능한 설명 형식으로 변환하려는 것 같습니다.
ESC(0x1b) 문자로 변환하려는 경우 , 또는 (일반적으로 비표준 동일한 문자도 지원됨 )을 \E
사용하여 다음을 수행할 수 있습니다.ksh93
zsh
bash
%q
printf '%s\n' "${red//$'\e'/\\E}"
또는 파이프로sed $'s/\e/\\\\E/g'
그래픽이 아닌 문자를 변환하는 보다 일반적인 방법으로 다음을 사용할 수 있습니다.
$ printf %s "$red" | od -A n -vt c # POSIX
033 [ 3 1 m
$ printf %s "$red" | sed -n l # POSIX
\033[31m$
$ printf '%s\n' "${(qqqq)red}" # zsh
$'\033[31m'
$ printf '%s\n' "$red" | cat -vt # some cat implementations
^[[31m
$ printf %s "$red" | uconv -x ':: [:Cc:]; ::Hex;' # ICU tools
\u001B[31m
$ printf %s "$red" | uconv -x ':: [:Cc:]; ::Name;' # ICU tools
\N{<control-001B>}[31m
답변2
od
, 또는 유사한 방법을 사용하여 사람이 읽을 수 있는 형식으로 이진 데이터를 인쇄합니다 hexdump
. xxd
예를 들어:
$ tput setaf 1 | od -c
0000000 033 [ 3 1 m
0000005
답변3
printf
예를 들어 직접 사용할 수 있습니다 .
printf "\033[31mfail"