나는 매우 복잡한 프롬프트를 원합니다. 여기에는 로그인 이름, 컴퓨터 이름, 날짜, 시간, 작업 디렉터리, 마지막 명령 결과 및 줄 바꿈 문자가 포함되어야 합니다. 저도 아이템 하나하나에 색을 입히고 싶었어요. 그래서 저는 .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}] "
...
잠깐..저거 봤어? 이렇게 하면 무슨 일이 일어나고 있는지 더 쉽게 알 수 있습니다.