Bash 기능에서 PS1 생성

Bash 기능에서 PS1 생성

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". 더 좋을 것입니다.

관련 정보