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 쉘에서 유효합니다.