.bash_profile에 다음과 같이 환경 변수를 정의한다고 가정해 보겠습니다.
PS1='\[\e[31;1m\][\u@\h \T \w] \[\e[0m\]'
이 변수를 사용하면 Linux 프롬프트에 다음과 같은 특정 정보가 표시됩니다.
[jeff@node21 01:48:30 ~]
[jeff@node22 01:48:30 ~]
[jeff@node23 01:48:30 ~]
[jeff@master 01:48:30 ~]
"마스터"라는 단어가 나타날 때 대문자로 표시하고 싶습니다(해당 노드에서는 아무 작업도 수행하지 않을 것이며 rsh
다른 노드에서 작업을 수행하는 것을 잊어버렸을 때 눈에 띄기를 원합니다).
"master"라는 단어가 포함되어 있지 않기 때문에 sed
변수에 사용할 수 없습니다 .PS1
마지막으로,노드 "마스터"에 있을 때 프롬프트를 대문자로 표시하고 싶습니다. 변수 "PS1"을 평가하고 문자열을 조작한 다음 프롬프트가 작동하도록 다시 할당하는 방법이 있습니까?
답변1
최신 버전을 사용한다고 가정하면 대신 에 변수를 사용하여 bash
이 작업을 수행할 수 있습니다 .PROMPT_COMMAND
PS1
\h
PROMPT_COMMAND='
myhost=$(hostname)
if [[ $myhost == master ]]; then
myhost=${myhost^^}
fi
'
PS1='\[\e[31;1m\][\u@$myhost \T \w] \[\e[0m\]'
PROMPT_COMMAND
각 프롬프트가 작성되기 전에 그 안의 모든 항목이 실행됩니다. 위의 정의는 의 myhost
출력을 설정합니다 hostname
.myhost
주인, ${var^^}
확장하면 대문자가 됩니다.
답변2
또 다른 방법은
PS1='\[\e[31;1m\][\u@$(hostname | perl -pe "\$_ = uc if m/master/") \T \w] \[\e[0m\]'
내 조언이 Thor의 조언만큼 체계적이지 않다는 점은 인정하지만 기본적으로 알아두면 좋습니다.
$(cmd)
는 일반적인 명령 대체 구문입니다 bash
.
좋은 것도 있어요어떻게bash 프롬프트의 구성만 처리합니다. 이것은 확실히 읽을 가치가 있습니다.