PS1
다음과 같이 구성 하려고 합니다 .
Green="\[\e[32;1m\]"
Red="\e[0;31m"
Purple="\e[0;35m"
STARTCOLOR="\[\e[40m\]"
ENDCOLOR="\[\e[0m\]"
export PS1="$STARTCOLOR$Green\u@$Purple\h $Red\w$Green>$ENDCOLOR "
질문이 몇 개 있습니다.
\[\e[32;1m\]
이들그리고 그리고 의 차이점은 무엇인가요\e[32;1m
? 그들은 동일합니까?- 명령을 실행 한 후에
export PS1
는 잘 작동하지만 20자 정도 입력하면 첨부한 대로 문자가 덮어쓰여집니다. 이게 무슨 문제야? - 무슨 뜻인가요
STARTCOLOR(\e[40m)/ENDCOLOR(\e[0m)
?
부록
몇 가지 테스트를 거친 후 문제를 해결하기 위해 다음과 같은 변경 사항을 얻었습니다. 즉, \e
형식을 형식으로 바꿔야 합니다 \\[\e
.
Red="\\e[1;31m" #-- not working
Red="\[\e[1;31m\]" #-- working
답변1
힌트를 설정하는 도우미 함수가 있는데 이스케이프 코드 참조를 찾는 데 더 많은 시간을 소비하고 싶지 않기 때문에 모든 텍스트 색상 값을 여기에 인코딩합니다.
function set_prompt ( )
{
# Prompt setup
# ##################
# Black \e[0;30m
# Blue \e[0;34m
# Green \e[0;32m
# Cyan \e[0;36m
# Red \e[0;31m
# Purple \e[0;35m
# Brown \e[0;33m
# Gray \e[0;37m
# Dark Gray \e[1;30m
# Light Blue \e[1;34m
# Light Green \e[1;32m
# Light Cyan \e[1;36m
# Light Red \e[1;31m
# Light Purple \e[1;35m
# Yellow \e[1;33m
# White \e[1;37m
local COLOR_DEFAULT='\[\e[0m\]'
local COLOR_BLACK='\[\e[0;30m\]'
local COLOR_BLUE='\[\e[0;34m\]'
local COLOR_GREEN='\[\e[0;32m\]'
local COLOR_CYAN='\[\e[0;36m\]'
local COLOR_RED='\[\e[0;31m\]'
local COLOR_PURPLE='\[\e[0;35m\]'
local COLOR_BROWN='\[\e[0;33m\]'
local COLOR_GRAY='\[\e[0;37m\]'
local COLOR_DARK_GRAY='\[\e[1;30m\]'
local COLOR_L_BLUE='\[\e[1;34m\]'
local COLOR_L_GREEN='\[\e[1;32m\]'
local COLOR_L_CYAN='\[\e[1;36m\]'
local COLOR_L_RED='\[\e[1;31m\]'
local COLOR_L_PURPLE='\[\e[1;35m\]'
local COLOR_YELLOW='\[\e[1;33m\]'
local COLOR_WHITE='\[\e[1;37m\]'
local PS1_SET_TITLE='\[\e]0;\w\a\]'
local PS1_SET_TIME="${COLOR_DEFAULT}\t"
local PS1_SET_RET_CODE="${COLOR_L_RED}(\$?)"
local PS1_SET_USER="${COLOR_L_GREEN}\u@\h"
local PS1_SET_PWD="${COLOR_YELLOW}\w"
local PS1_LN_1="${PS1_SET_TITLE}\n"
local PS1_LN_2="${PS1_SET_TIME} ${PS1_SET_RET_CODE} "
local PS1_LN_2="${PS1_LN_2}${PS1_SET_USER} ${PS1_SET_PWD} ${COLOR_DEFAULT}\n"
echo "${PS1_LN_1}${PS1_LN_2}"
}
그러면 다음과 같이 할 수 있습니다:
PS1=$( set_prompt )
# Use '#' for root shell
export PS1=${PS1}'$ '
unset -f set_prompt
다음은 VT100 터미널 코드를 설명하는 링크입니다.http://www.termsys.demon.co.uk/vtansi.htm
\[
- 인쇄되지 않는 문자의 시작 순서
\]
- 인쇄되지 않는 문자의 끝 순서
- "[\e[32;1m]"과 \e[32;1m"의 차이점은 무엇입니까? 둘이 같은가요?
\[\e[32;1m\]'. Without
아니요, 콘솔에서 시퀀스를 인쇄하려고 시도하는 []` 이어야 합니다 .
- STARTCOLOR(\e[40m)/ENDCOLOR(\e[0m)은 무엇을 의미하나요?
STARTCOLOR는 배경을 검은색으로 설정한다는 뜻이고, ENDCOLOR는 모든 텍스트 속성을 재설정한다는 뜻입니다. 즉, "기본 콘솔 색상을 지정하세요"라는 의미입니다.
답변2
Bash 매뉴얼에서:
\[
터미널 제어 시퀀스를 프롬프트에 포함하는 데 사용할 수 있는 비인쇄 문자 시퀀스를 시작합니다
\]
.
\[
\]
터미널로 전달되지 않습니다 . 그들은 bash에게 그들 사이의 문자가 인쇄되지 않을 것이라고 말합니다. 그것들이 없으면 bash [32;1m
는 (예를 들어) 이스케이프 문자 뒤에 오는 시퀀스가 화면의 공간을 차지하지 않는다는 것을 알 수 없습니다 . 이는 생략할 때 프롬프트의 길이를 올바르게 계산하지 못하는 이유를 설명합니다.
$PS1
문제는 일관성이 낮습니다(또는 Markdown 버그일 수도 있음) . 괄호(문자 그대로 표시됨)뿐만 아니라 문자 그대로의 백슬래시 괄호 시퀀스가 있어야 합니다 .
로 시작하는 이스케이프 시퀀스는 \e
터미널 에뮬레이터에 의해 해석됩니다. 그들은에 기록되어 있습니다Xterm 제어 시퀀스(ctlseqs)문서(다른 터미널 에뮬레이터는 대부분 호환되는 경향이 있음) 예를 들어 \e[32;1m
전경색을 굵은 녹색으로 전환하고 \e[40m
배경색을 검정색으로 전환합니다 \e[0m
.
답변3
대부분의 최신 터미널 에뮬레이터는 ANSI 이스케이프 코드를 사용하여 디스플레이의 다양한 측면을 제어할 수 있습니다.
대부분의 ANSI 코드는 2자 코드 ESC-[, 이스케이프 문자(ASCII 십진수 27)로 시작하고 그 뒤에 왼쪽 대괄호 문자가 옵니다. 이 시퀀스는 CSI 또는 제어 시퀀스 개시자라고도 합니다.
이스케이프 문자는 직접 입력할 수 있는 문자가 아니기 때문에(Esc 키는 일반적으로 응용 프로그램별로 다른 용도로 사용됩니다) bash는 이를 인용하기 위해 '\e'를 사용합니다.
ANSI 그래픽 모드 설정 명령을 사용하여 텍스트 색상을 변경합니다.
\e[<value>m
이는 <value>
세미콜론( )으로 ;
구분된 값 목록 일 수 있습니다. 굵은 속성은 색상 속성과 함께 사용하면 유용하지만 일반적으로 하나의 값만 사용됩니다.
Alexander Pogrebnyak의 답변에 나열된 값을 보면 세미콜론 앞의 0 또는 1이 굵게 또는 굵게 선택하지 않습니다.
\e[1m # bold
\e[5m # blink
\e[0m # all attributes off
다음은 유용한 코드 목록입니다.http://ascii-table.com/ansi-escape-sequences.php