Bash 여기 문서에서 ANSI 색상 이스케이프 코드를 사용할 수 있습니까?

Bash 여기 문서에서 ANSI 색상 이스케이프 코드를 사용할 수 있습니까?

Bash 스크립트로 메시지를 인쇄하고 있는데 그 일부를 색칠하고 싶습니다.

#!/bin/bash

normal='\e[0m'
yellow='\e[33m'
cat <<- EOF
    ${yellow}Warning:${normal} This script repo is currently located in:
    [ more messages... ]
EOF

tmux하지만 터미널에서 ( 내부적으로 gnome-terminal) 실행할 때ANSI 이스케이프 문자\예를 들어 표 형식으로 인쇄해 보세요 .

\e[33mWarning\e[0m This scr....

색상화하려는 부분을 printf여기 문서 외부의 명령으로 이동하면 작동합니다. 예를 들어 다음과 같이 작동합니다.

printf "${yellow}Warning:${normal}"
cat <<- EOF
    This script repo is currently located in:
    [ more messages... ]
EOF

출처 man bash– 이 문서:

매개변수 및 변수 확장, 명령 대체, 산술 확장 또는 경로 이름 확장을 수행하지 않습니다.단어. 그 안에 문자가 있으면단어인용됐으니 그럼구분 기호따옴표를 제거한 결과입니다.단어, 여기 문서의 줄은 확장되지 않습니다. 만약에단어따옴표가 없는 경우 이 문서의 모든 행은 매개변수 확장, 명령 대체 및 산술 확장을 거칩니다. 후자의 경우 문자 순서는 다음과 같습니다.\<줄바꿈>무시되며 문자 및 를 인용하는 데 \사용해야 합니다 \.$`

이것이 ANSI 이스케이프 코드에 어떤 영향을 미치는지 모르겠습니다. cat여기에 나와 있는 Bash 문서에서 ANSI 이스케이프 코드를 사용할 수 있습니까 ?

답변1

스크립트에서 이러한 작업은

normal='\e[0m'
yellow='\e[33m'

그 문자를 넣어문자 그대로변수로, 즉 \e[0m이스케이프 시퀀스 대신. 예를 들어, printf구문 이스케이프 문자(또는 그 일부 버전)를 사용할 수 있습니다 .echo

normal=$(printf '\033[0m')
yellow=$(printf '\033[33m')

tput그러나 올바르게 설정된 터미널에서 작동하므로 를 사용하는 것이 더 나을 것입니다 .

normal=$(tput sgr0)
yellow=$(tput setaf 3)

printf귀하의 예를 보면 이스케이프 문자 버전으로 취급을 사용하고 있는 것 같습니다 \e(이는 시스템에서 작동할 수 있지만 일반적으로 다른 시스템으로 이식 가능하지 않습니다). 이것을 보려면 다음을 시도하십시오.

yellow='\e[33m'
printf 'Yellow:%s\n' $yellow

너는 보게 될 것이다단어수치:

Yellow:\e[33m

이스케이프 시퀀스 대신. 그것들을 printf형식으로 만들고 printf(가능하다면) 우리에게 해석하라고 말해주세요.

추가 자료:

답변2

이 할당은 변수에 이스케이프 문자를 배치하지 않습니다.

normal='\e[0m'                  yellow='\e[33m'

이렇게 하려면 echo -e printf또는 $'...'(bash에서)이 필요합니다.

bash를 사용하고 있으므로 다음을 사용할 수도 있습니다.

normal=$'\e[0m'                 yellow=$'\e[33m'

$앞에 문자열을 기록해 두십시오 '\e[0m'.

그러나 이스케이프 문자를 얻는 이식 가능한 방법은 아래와 같이 printf입니다.

normal="$(printf '\033[0m')"    yellow="$(printf '\033[33m')"

이스케이프 문자(033)의 8진수 값은 모든 POSIX 쉘에서 유효합니다.

관련 정보