bash 명령 프롬프트에 Node 버전을 표시하고 싶습니다. PS1의 이 부분을 생성하는 함수를 만들었습니다. 노드의 주요 버전을 가져오고 숫자 값에 따라 색상을 지정합니다. 내 .bash_profile
:
nv_ps1 () {
nv_re="v([0-9]+)\.[0-9]+\.[0-9]"
if [[ $($NVM_BIN/node --version) =~ $nv_re ]]; then
nv_major=${BASH_REMATCH[1]}
let nv_color=$nv_major+26
echo "\[\e[${nv_color}m\]$nv_major\[\e[m\]"
fi
}
export PS1="[\$(nv_ps1) \[\e[36m\]\t\[\e[m\] \W]\\$ "
그러나 함수 출력의 이스케이프 시퀀스는 평가되지 않으며 명령 프롬프트는 다음과 같이 표시됩니다.
[\[\e[34m\]8\[\e[m\] 08:54:58 ~]$
어떻게 작동하게 할 수 있나요?
답변1
쉘은 명령을 실행하기 전에 이스케이프 문자를 평가합니다.NV_PS1. 따라서 이 명령은 이스케이프 문자를 출력해서는 안 되며 문자 그대로만 표시됩니다. Ascii 코드(색상)는 다음을 통해 출력될 수 있습니다.NV_PS1이전에 변환한 적이 있다면 echo -e
충분할 것 같습니다. 하지만 \[
특히\]
PS1설명, 함수에서 출력할 수 없습니다. 이를 무시할 수 있지만 조만간 실망하게 될 것입니다.
가장 간단한 해결책은 입니다 export PS1="[$(nv_ps1) \[\e[36m\]\t\[\e[m\] \W]\\$ "
. 따라서 이스케이프 문자는 다음에 직접 저장됩니다.PS1임무 중.
장점: 리뷰만 있음NV_PS1한 번, 쉘은 모든 프롬프트에서 분기되지 않습니다.
단점: 평가만 가능NV_PS1한 번만 실행하면 노드가 업데이트되면 현재 열려 있는 셸 프롬프트가 표시되지 않습니다(그러나 표시할 수는 있음 source ~/.bashrc
).
프롬프트를 최신 상태로 유지하려면 두 개의 함수 호출을 수행 export PS1="[\[\$(nv_ps1 color)\]\$(nv_ps1 version)\[\e[m\] \[\e[36m\]\t\[\e[m\] \W]\\$ "
하고 이를 함수에 넣어야 합니다 [[ $1 == color ]] && printf "\e[${nv_color}m" || printf "${nv_major}"
.
참고 사항:
- PS1을 내보낼 필요가 없습니다.
지역 변수 사용을 선호합니다.
local nv_re="v([0-9]+)\.[0-9]+\.[0-9]" local nv_major="${BASH_REMATCH[1]}" local nv_color=$((nv_major + 26))
답변2
귀하의 기능에서 nv_ps1
사용해보십시오 echo -e "\033[${nv_color}m${nv_major}\033[0m"
. 더 좋을 것입니다.