bash - 복잡한 프롬프트

bash - 복잡한 프롬프트

나는 매우 복잡한 프롬프트를 원합니다. 여기에는 로그인 이름, 컴퓨터 이름, 날짜, 시간, 작업 디렉터리, 마지막 명령 결과 및 줄 바꿈 문자가 포함되어야 합니다. 저도 아이템 하나하나에 색을 입히고 싶었어요. 그래서 저는 .bashrc다음과 같은 일종의 괴물을 삽입했습니다.

# login and computer name
PS1='[\e[1;37m\]\u\e[m\]@\e[1;32m\]\h\e[m\]] '
# date, time and working directory
PS1=$PS1'[\e[1;34m\]\D{%Y-%m-%d} \e[1;35m\]\t\e[m\]] \e[1;33m\]\w\e[m\] '
# result of last command and command prompt in new line
PS1=$PS1'\e[1;31m\]${?#0}\e[m\]\n \e[1;36m\]\$\e[m\] '

나는 이것이 나쁜 해결책이라는 것을 알고 있지만 그것을 개선하기에는 bash에 대한 경험이 너무 적습니다. 그러나 그것이 유일한 문제는 아닙니다.

 $ aaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bash: bbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: command not found...

그러나 시각적 캐럿은 마지막 키를 a누른 Home후 명령의 시작 부분으로 이동하지 않습니다 . 보시다시피 실제 캐럿은 시작 부분에 있습니다. 왜 이런 일이 발생합니까? 명령 프롬프트를 어떻게 개선할 수 있나요 .bashrc?


고쳐 쓰다:

@Groxxda의 제안을 사용한 후 또 다른 문제가 발생했습니다. 내 .bashrc PS1정의는 다음과 같습니다이것. 지금은 설명된 문제가 발생하지 않습니다. 하지만 내 명령 기록에 이 있고 ls이 전에는 이 있었고 cat script.sh화살표를 두 번 위로 밀면 명령과 같은 결과가 나오고 cat scls버퍼에는 두 개의 기호만 있습니다(만 ls). 왜 이런 일이 발생합니까? 이 문제를 어떻게 처리해야 합니까?

답변1

\[프롬프트 텍스트의 보이지 않는 부분을 및 로 묶어야 합니다 \]. 전체 프롬프트의 길이를 계산하는
데 사용되므로 인쇄 후 커서 위치를 결정할 수 있습니다. 예를 들어, ANSI 색상 이스케이프 코드는 보이지 않습니다. 나중에 출력되는 텍스트의 색상을 변경합니다. 다음과 같이 닫아야 합니다.bash

\e[1;35m~이 되다\[\e[1;35m\]

업데이트에서 이것이 도움이 된다고 썼지만 또 다른 문제가 있습니다. /로 기록을 사용하면
화면이 올바른 위치에서 지워지지 않습니다.UpDown

이는 첫 번째 문제의 또 다른 측면에 불과합니다. 프롬프트 텍스트 길이 계산이 잘못되었습니다.

링크에서 수정된 프롬프트 텍스트를 살펴보겠습니다.

# login and computer name                                                      
PS1='[\e[\[1;37m\]\]\u\e[\[m\]\]@\e[\[1;32m\]\]\h\e[\[m\]\]] '                  
# date, time                                                                    
PS1=$PS1'[\e[\[1;34m\]\]\D{%Y-%m-%d} \e[\[1;35m\]\]\t\e[\[m\]\]] '              
# working directory and result of last command                                  
PS1=$PS1'\e[\[1;33m\]\]\w\e[\[m\]\] \e[\[1;31m\]\]${?#0}\e[\[m\]\]\n '          
# command prompt                                                                
PS1=$PS1'\e[\[1;36m\]\]\$\e[\[m\]\] '

문제는 전체 색상 이스케이프 시퀀스가 ​​포함되지 않는다는 것입니다. \[프롬프트 는 다음으로 끝납니다.\]

[\e[\[1;37m\]\]... 

여기서 색상 이스케이프 시퀀스는 입니다 \e[1;37m. 따라서 이스케이프 문자 \e[둘 다 외부에 있습니다. 최소한 [보이는 것으로 간주됩니다. 또한 \]문제를 일으키지는 않지만 적어도 혼란을 주는 두 개의 클로저가 있으며 중첩될 수 없습니다.
올바른 작성 방법은 다음과 같습니다.

[\[\e[1;37m\]... 

다른 색상 이스케이프 시퀀스에도 동일한 문제가 있습니다.

답변2

모듈화해야 합니다. 이렇게 하면 추적이 더 쉬워집니다.

CS='\[\033[1;3' CE='m\]'
WT=${CS}7${CE} LB=${CS}6${CE} PR=${CS}5${CE} \
DB=${CS}4${CE} YL=${CS}3${CE} GN=${CS}2${CE} RD=${CS}1${CE} 
CE='\[\033[m\]' CS=

이제 당신은 당신의 일을 합니다:

# login and computer name                                                      
PS1="[${WT}\u${CE}@${GN}\h${CE}] "

...

잠깐..저거 봤어? 이렇게 하면 무슨 일이 일어나고 있는지 더 쉽게 알 수 있습니다.

관련 정보