PS1을 올바르게 사용자 정의하는 방법은 무엇입니까?

PS1을 올바르게 사용자 정의하는 방법은 무엇입니까?

bashrc에서 이것으로 bash를 사용자 정의했습니다.

export PS1="\e[0;36m\h\e[m \e[0;33m\w/\e[m \e[0;31m\n\$ →\e[m  "

그래서 나는 다음과 같은 것을 얻습니다(색상 포함).

Ahuri ~/Public/ 
$ →  

하지만 긴 명령에는 문제가 있습니다. 한 줄보다 긴 매우 긴 명령을 작성하면 첫 번째 줄을 덮어쓰기 시작합니다.

예:

Ahuri ~/Public/ 
$ → ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

"^"를 계속 추가하면 다음과 같은 결과를 얻습니다.

Ahuri ~/Public/ 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

내 "$→"를 덮어쓰고 전체 줄을 덮어씁니다.

답변1

괜찮아요 \n. 이것은 다시 오래된 이스케이프 시퀀스 길이 문제입니다. \e[0m유사한 내용은 프롬프트의 실제 길이에 포함되지 않으므로 이를 인터프리터에게 지적하려면 \[.. 로 묶어야 합니다.\]

PS1="\[\e[0;36m\]\h\[\e[m\] \[\e[0;33m\]\w/\[\e[m\]\n \[\e[0;31m\]\$ →\[\e[m\]  "

답변2

더 쉬운 옵션은 tput시퀀스를 사용하는 것입니다.

export PS1='\[$(tput setaf 4)\]\h\[$(tput sgr0)\] \[$(tput setaf 3)\]\w/\[$(tput sgr0)\]\n\[$(tput setaf 1)\]\$ →\[$(tput sgr0)\] '

쉘이 인쇄 가능한 출력으로 계산하지 않도록 명령 대체( )로 삽입된 터미널 제어 시퀀스를 \[묶습니다 . 하드와이어 방식 대신 명령 대체를 사용하면 더 많은 이점을 얻을 수 있습니다.\]$(tput … )옳은터미널 유형이 무엇이든 순서를 제어하십시오.

답변3

추가 행을 표시하여 입력할 $PROMPT_COMMAND필요가 없도록 하는 데 사용됩니다 .\n$PS1

관련 정보