bash PS1 변수 설정

bash PS1 변수 설정

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

관련 정보