변수를 사용하여 PS1의 터미널 색상 코드를 저장하시겠습니까?

변수를 사용하여 PS1의 터미널 색상 코드를 저장하시겠습니까?

광산에서는 .bashrcANSI 터미널 색상 코드를 사용하여 개별 비트의 색상을 지정합니다. 다음과 같습니다.

PS1='\u@\h:\w\[\033[33m\]$(virtual_env)\[\033[32m\]$(git_branch)\[\033[0m\]$ '

where virtual_envgit_branch는 stdout에 콘텐츠를 인쇄하는 bash 함수입니다.

이제 더 쉽게 읽고 수정할 수 있도록 색상 코드를 직접 삽입하는 대신 변수에 저장하고 참조하고 싶습니다 PS1. 그래서 다음과 같은 변수가 많이 있습니다.

GREEN="\[\033[32m\]"
YELLOW="\[\033[33m\]"
RESET="\[\033[0m\]"

나는 다음과 같은 것을 쓸 수 있기를 원합니다 :

PS1='\u@\h:\w${YELLOW}$(virtual_env)${GREEN}$(git_branch)${RESET}$ '

그러나 이것은 작동하지 않습니다. 색상 코드가 마치 이스케이프된 것처럼 프롬프트에 표시됩니다. 대신 큰따옴표를 사용하면 색상이 제대로 작동 PS1하지만 프롬프트가 변경되는 경우에만 이 작업을 수행합니다 source ~/.bashrc.

나는 사람들이 하는 다른 일들을 시도해 보았습니다. 를 사용하고 printf, 색상에 작은 따옴표를 사용하고, \[색상 변수 대신 및 을 입력했지만 아무 것도 작동하지 않는 것 같습니다.\]PS1

색상 코드 변수를 사용하는 방법은 무엇입니까?

답변1

해결책은 프롬프트를 정의할 때 쉘이 색상 변수를 바꾸도록 하는 것입니다. 그러나 함수는 그렇지 않습니다. 이렇게 하려면 원래 시도한 대로 큰따옴표를 사용하되 팁이 그려지기 전에 평가되지 않도록 명령을 이스케이프 처리하세요.

PS1="\u@\h:\w${YELLOW}\$(virtual_env)${GREEN}\$(git_branch)${RESET}$ "

각 명령 앞에 \.$()

이것을 에코하면 다음이 표시됩니다.

echo "$PS1"
\u@\h:\w\[\033[33m\]$(virtual_env)\[\033[32m\]$(git_branch)\[\033[0m\]$ 

보시다시피 색상 변수는 대체되지만 명령은 대체되지 않습니다.

답변2

문제는 변수에 GREEN"백슬래시 대괄호 백슬래시 0 3 3" 등으로 구성된 리터럴 문자열이 포함되어 있다는 것입니다. 예를 들어 터미널의 색상을 변경하는 데 필요한 ASCII 이스케이프 문자가 포함되어 있지 않습니다.

제어 문자를 GREEN(and YELLOWRESET)에 수동으로 넣을 수 있지만 더 좋은 옵션은 tput먼저 사용하는 것입니다. 이렇게 하면 아무 것도 하드코딩할 필요가 없고 모든 터미널 유형이 지원됩니다.

GREEN="$(tput setaf 2)"
YELLOW="$(tput setaf 3)"
RESET="$(tput setaf 0)"

"백슬래시 0 3 3" 등을 직접 입력하면 나타나는 이유는 PS1특정 백슬래시 시퀀스의 해석이 다음과 같기 때문입니다.특징bash에 대한 프롬프트(매뉴얼의 PROMPTING 섹션 참조) 이 대체가 발생합니다.앞으로단, 매개변수 확장, 명령 대체, 산술 확장, 따옴표 제거 등은 다른 모든 연산의 결과에 적용되지 않습니다.

답변3

$GREEN, $YELLOW 및 $RESET이 채워지는 방식을 변경합니다.

GREEN="$(echo -e "\033[32m")"
YELLOW="$(echo -e "\033[33m")"
RESET="$(echo -e "\033[0m")"

PS1='\u@\h:\w${YELLOW}$(virtual_env)${GREEN}$(git_branch)${RESET}$ '

관련 정보