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


33

.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것은 효과가없는 것 같습니다.

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


당신은 우리에게 당신을 줄 수 .bashrc있습니까?
cuonglm

@cuonglm 모든 .bashrc가 우리에게 속해 있습니까? 내가 보여 줄게
CivFan

답변:


20

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

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

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


1
$ (git_branch)도 $ {YELLOW} 등을 사용하여 인쇄하려고하면 작동하지 않는 것 같습니다. 해당 섹션만으로도 모든 [] 문자를 얻을 수 있습니다.
WB 리드

7

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

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

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

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


5
이렇게하면 색 변수를 \[\]안에 넣을 필요가 $PS1있습니다. 예를 들면 다음과 같습니다 PS1='\u@\h:\w\[${YELLOW}\]'.. 이 작업을 수행하지 않으면 다음 줄로 넘어가는 긴 명령이 발생하면 모든 종류의 문제가 발생합니다. 셸은를 사용하여 \[\]인쇄 할 수없는 문자를 결정하므로 프롬프트 길이 계산에 영향을주지 않습니다. 터미널 너비를 초과 할 때 선을 올바르게 그릴 수 있도록 이것이 필요합니다.
Patrick

에 대해 몰랐습니다 tput. 감사합니다. 나는 지금 Patrick의 대답을 사용할 것이지만 기회가 생기면 다시 방문 할 것입니다.
Ismail Badawi

2

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

1
이것은 실제로 Celada의 대답과 똑같은 일을합니다. 그러나 단말기가 색상 설정에 다른 이스케이프 코드를 사용하는 경우 Celada는 더 이식성이 뛰어납니다. 또한 멀티 라인 프롬프트와 동일한 문제가 발생합니다.
Patrick

2
\[…\]비트 요구는 변수에 물건 수 없습니다 프롬프트에 남아 있습니다. 그것을 완전히 제거하면 표시 문제가 발생합니다 (커서가 bash가 예상하는 위치에 있지 않음).
Gilles 'SO- 악한 중지'

@Patrick 문제 외에도 echo -e는 이식성이 없습니다.
helpermethod

1
휴대 tput setaf할 수없는 기능으로 더 많은 기능이 제공됩니다 . 라이트 시안과 같은 "라이트"색상 세트에서 선택할 수 없습니다. 그러나 @Cyrus의 대답은 그렇지 않습니다.
CivFan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.