나는 Bash 스크립트(주로 CentOS)에서 색상을 많이 사용하지만 더 편리하게 사용하기 위해 결국재정의하다색상 값에 대한 변수:
local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local CYAN="\[\033[0;36m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
local NO_COLOUR="\[\033[0m\]"
또는 다음을 사용할 수 있습니다 tput
.
bold=`tput bold`
normal=`tput sgr0`
whitef=`tput setaf 7`
greenf=`tput setaf 2`
redb=`tput setab 1`
디렉토리를 grep 했는데 /etc/rc.d/init.d
색상 정의와 관련된 내용을 찾지 못했습니다.
이미 그런 정의가 있나요? 그렇지 않은 경우 파일에 넣고 /etc/rc.d/init.d
스크립트에 포함시킵니다./etc/rc.d/init.d/functions
답변1
귀하가 요구하는 내용에는 여러 가지 측면이 있습니다.
첫째, bash는 색상을 정의하지 않습니다. 사실 bash는 색상이 존재한다는 사실을 전혀 모릅니다. 그것은 당신이 문자를 출력하라고 지시한다는 것만 알고 있습니다 \033[0;36m
. 터미널 에뮬레이터(xterm, gnome-terminal 등)는 이러한 문자를 수신하고 "청록색으로 출력을 시작해야 합니다"를 이해합니다.
따라서 터미널 에뮬레이터는 색상을 이해합니다. 터미널 에뮬레이터는 \033[0;36m
청록색을 인식하지만 다른 터미널 에뮬레이터는 완전히 다른 청록색 문자 집합을 사용할 수 있습니다(비록 정상적인 터미널 에뮬레이터는 표준을 광고하고 이를 수행하지 않지만). 그렇기 때문에 tput
. 를 실행하면 tput setaf 6
터미널 tput
의 이스케이프 코드에서 색상 6(청록색)을 찾아 해당 이스케이프 코드를 출력합니다.
(바라보다이 문제tput setaf
코드 에 대한 자세한 내용)
이제 bash로 돌아갑니다. 제가 청록색을 언급할 때 항상 \033[0;36m
대신에 을 사용한다는 것을 눈치채셨을 것입니다 \[\033[0;36m\]
. 대괄호가 누락되었습니다. 대괄호의 목적은 프롬프트에서 이스케이프 코드(색상)를 사용할 때 bash가 어떤 문자가 인쇄되지 않는지(너비가 0이고 실제로는 아무것도 표시하지 않음) 알아야 한다는 것입니다. 따라서 인쇄되지 않는 문자를 묶습니다 \[
\]
. 이러한 문자를 제거하면 처음에는 모든 것이 잘 작동하는 것처럼 보이지만 명령이 터미널 너비를 초과하면 모든 종류의 이상한 일이 발생하기 시작합니다. 이는 입력할 때 명령이 다음 줄로 넘어가야 하는 시기를 bash가 알아야 하기 때문입니다. 이를 위해 프롬프트의 너비를 계산한 다음 입력 너비를 계산합니다.
tput
.is CYAN="\[\033[0;36m\]"
에 대한 또 다른 참고 사항아니요. CYAN="$(tput setaf 6)"
방금 논의한 것처럼 대괄호는 bash와 관련이 있으며 tput
터미널 이스케이프 코드만 출력됩니다.
대괄호는 일반적으로 프롬프트 내에서만 관련이 있으므로 스크립트나 기타 콘텐츠의 출력에 색상을 사용하는 경우에는 사용하면 안 됩니다. 즉, 프롬프트 외부에서 색상을 사용하려면 여러 변수를 정의해야 합니다. 하나는 프롬프트에 대괄호가 있고 하나는 다른 모든 것에 대괄호가 없습니다. 프롬프트에서 색상을 참조할 때마다 수동으로 대괄호를 추가할 수 있습니다.
간단히 말해서 다음과 같이 정의하고 싶을 것입니다.
local CYAN="$(tput setaf 6)" # OR CYAN="\033[0;36m"
local LIGHT_CYAN="$CYAN$(tput bold)" # OR LIGHT_CYAN="\033[1;36m"
local PROMPT_CYAN="\[$CYAN\]"
local PROMPT_LIGHT_CYAN="\[$LIGHT_CYAN\]"