변수를 사용하여 PS1의 터미널 색상 코드를 저장 하시겠습니까? 대신 변수에 참조하고 싶습니다

.bashrc에서는 ANSI 터미널 색상 코드를 사용하여 다양한 비트를 채색합니다. 다음과 같이 보입니다 :

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

여기서 virtual_envgit_branch출력 물건이 표준 출력에 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했습니다. 색상에 작은 따옴표를 사용 하고 색상 변수 대신 \[and \]를 넣는 PS1것은 효과가없는 것 같습니다.

색상 코드에 변수를 어떻게 사용합니까?



답변

해결책은 프롬프트를 정의 할 때 쉘이 색상 변수를 대체하도록하지만 함수는 정의하지 않는 것입니다. 이렇게하려면 원래 시도한대로 큰 따옴표를 사용하지만 프롬프트가 표시 될 때까지 평가되지 않도록 명령을 이스케이프하십시오.

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\]$ 

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


답변

문제는 변수 GREEN에 “backslash bracket backslash zero three three”등으로 구성된 리터럴 문자열이 포함되어 있다는 것 입니다. 터미널 색상 변경에 필요한 ASCII 이스케이프 문자가 포함되어 있지 않습니다.

제어 문자를 수동으로 GREEN(및 YELLOWRESET)에 넣을 수는 있지만, 더 좋은 옵션은 tput처음 부터 사용 하는 것이므로 아무것도 하드 코딩 할 필요가 없으며 모든 터미널 유형을 지원합니다.

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

이유 왜 등 … 직접으로 “제로 삼 세 개의 백 슬래시”넣어 그것은 세계 PS1어느 백 슬래시 시퀀스의 해석이된다 기능 배쉬의이 매뉴얼에서하라는 섹션을 참조하십시오 (프롬프트의.이 대체가 발생 하기 전에 매개 변수 확장, 명령 대체, 산술 확장 및 따옴표 제거이므로 다른 모든 연산의 결과에는 적용되지 않습니다.


답변

$ 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}$ '