답변1
커서를 적절하게 관리하기 위해 쉘은 프롬프트 문자열의 어떤 부분이 실제로 커서를 이동하게 하고 어떤 부분이 그렇지 않게 하는지 알아야 합니다.
이렇게 하려면 표시되는 문자를 생성하지 않는 프롬프트 부분을 다음으로 묶어야 합니다 \\[
.\\]
프롬프트 형식화는 궁극적으로 여러 단계에서 발생합니다. 프롬프트 확장 코드와 셸 변수는 셸 자체에서 처리되지만 색상과 형식화 코드는 별도 프로세스인 터미널 에뮬레이터에만 전달됩니다.
귀하의 팁은 다음과 같습니다.
declare -- PS1="\\[\\e]0;\\u@\\h: \\w\\a\\]\${debian_chroot:+(\$debian_chroot)}\\[\\e[1m\\e[38;5;208m\\e[48;5;24m\\u@\\h\\[\\e[0m\\]:\\[\\e[97m\\]\\w\\[\\e[0m\\]\\\$
\\[
- 비생산적인 부분을 시작하세요\\e]0;\\u@\\h: \\w\\a
- 이 부분은 이 기능을 지원하는 터미널 에뮬레이터의 창 제목을 변경하므로 실제 프롬프트의 일부가 되지 않습니다.\\]
- 비생산 부분 종료\${debian_chroot:+(\$debian_chroot)}
-$debian_chroot
변수가 설정되어 있고 비어 있지 않은 경우(즉, 쉘이 chroot 환경에 있는 경우) 해당 값은 괄호 안에 출력됩니다. 그렇지 않으면 빈 문자열이 출력됩니다. 이러한 확장은 셸 내에서 완전히 처리되므로 셸은 항상 이 부분의 길이를 알고 있습니다.\\[
- 또 다른 비생산적인 부분을 시작하세요\\e[1m\\e[38;5;208m\\e[48;5;24m
- 굵게 설정, 8비트 전경색 설정, 8비트 배경색 설정. 이는 유효한 비인쇄 형식 코드입니다.- 여기에 "비생산 섹션 종료" 코드가 있어야 하는데 누락되었습니다!
\\u@\\h
admin@OLAF
- 이렇게 하면 사용자 이름@호스트 이름과 같은 텍스트가 생성됩니다 .\\[\\e[0m\\]
- "기본 출력으로 재설정" 코드를 올바르게 캡슐화합니다.:
- 콜론만 출력\\[\\e[97m\\]
- "밝은 전경색 설정" 코드를 올바르게 캡슐화합니다.\\w
- 쉘 프롬프트 확장: 현재 작업 디렉토리 출력\\[\\e[0m\\]
- "기본 출력으로 재설정" 코드를 올바르게 캡슐화합니다.\\\$
- 쉘 프롬프트 특수 확장:$
일반 사용자이거나#
루트인 경우 출력됩니다.
따라서 코드 부족으로 인해 셸은 문자열 "admin@OLAF"(셸에 의해 확장됨 \\u@\\h
)가 형식 지정 코드의 일부가 되어 실제 프롬프트가 아닌 다른 위치에서 끝나는 것으로 가정합니다. 문자열 길이는 10자이므로 쉘이 프롬프트 다음에 명령을 다시 작성해야 할 때 이동할 열을 잘못 계산합니다. 즉, 정확히 10자입니다.
답변2
하나가 없습니다\\]
여기에 구분 기호:
\\[\\e[1m\\e[38;5;208m\\e[48;5;24m\\u@\
^^