
예를 들어 PS1
다음 값이 있다고 가정합니다.
'\w (\[\e[32m\]${__git_ps1_branch_name}\[\e[0m\] \[\e[31m\]*\[\e[31m\]%\[\e[0m\]>)\$ '
...여기에는 또는 __git_ps1_branch_name
같은 문자열이 있습니다 .master
feature123
묻다:위에 표시된 프롬프트에서 bash
생성될 프롬프트의 화면 너비(문자 수)를 계산하는 방법을 찾고 있습니다.PS1
최신 버전에서는 위의 힌트 사양 요소를 최종 표시된 값으로 대체하여 얻은 문자열 bash
로 표현식을 확장합니다 . ${PS1@P}
( \w
예를 들어 현재 디렉터리의 경로로 대체되거나 ${__git_ps1_branch_name}
변수에 포함된 문자열로 대체되는 __git_ps1_branch_name
등) 그러나 이것만으로는 문제를 해결하기에 충분하지 않습니다.
더 구체적으로 다음과 같이 설정하면:
EXPANDED_PS1="${PS1@P}"
... 표현식 에 의해 생성된 숫자 ${#EXPANDED_PS1}
(즉, 의 문자 수 )는 다음과 같습니다.$EXPANDED_PS1
상당히 크다bash 에 의해 생성된 프롬프트의 화면 너비보다 넓습니다 $PS1
. 초과분은 표시된 프롬프트에 색상을 제공하는 이스케이프 시퀀스에서 비롯됩니다.
어떤 경우 에라도,그래요반품지원되지 않는 bash 버전에 대한 솔루션에 관심이 있음@P
.
답변1
지원 없이는 어렵습니다 @P
. 문제는 PS1을 확장해야 하는데 해당 기능이 비공개라서 직접 사용할 수 없다는 점이다. 그럼에도 불구하고 아주 좋은 시도가 있습니다이 문제.
지원이 있는 경우 @P
다음이 도움이 될 수 있습니다.
$ echo -ne "\n${PS1@P}\033[6n";read -e -s -d R cnt;cnt=$((${cnt#;} - 1));echo $cnt
PS1
먼저 새 줄과 확장된 문자열을 보냅니다. 이는 커서가 이제 열에 있음을 의미합니다.PS1의 길이 + 1.
그런 다음 ANSI 이스케이프 코드가 있습니다.장비현황 보고(CSI6n) 보냈습니다. 터미널 응답:
커서 위치(CPR)는 ESC[n;mR을 전송하여 보고됩니다. 여기서 n은 행이고 m은 열입니다. )
값은 표준 입력에서 읽고 넣습니다 cnt
.
그것은 해킹적이고 ANSI 터미널에서만 작동하지만 작동하는 것 같습니다. 확장 길이가 터미널 너비보다 크면 열에 길이가 표시되지 않습니다 PS1
. 다른 프로세스의 출력도 문제가 될 수 있습니다.