PS1에서 echo -e를 사용하면 쉘에서 줄바꿈 문제가 발생합니다.

PS1에서 echo -e를 사용하면 쉘에서 줄바꿈 문제가 발생합니다.

문제:

명령줄 프롬프트를 엽니다.

여기에 이미지 설명을 입력하세요

문자를 여러 번 입력하세요.

여기에 이미지 설명을 입력하세요

새 줄로 줄 바꿈하는 대신 입력된 텍스트가 같은 줄로 줄 바꿈됩니다.

여기에 이미지 설명을 입력하세요

이제 b를 누르세요. 두 번째 줄 바꿈이 필요한 경우 새 줄로 줄 바꿈됩니다.

여기에 이미지 설명을 입력하세요


이 동작의 원인은 무엇입니까?

이와 같이 PS1을 사용하면 다음과 같은 동작이 발생합니다.

ps1Color="\033[1;35m"
export PS1='$(echo -en $ps1Color) Baz $'

색상 대신 에코를 직접 사용하려는 이유는 이전 명령의 종료 상태에 따라 조건부로 색상을 추가하고 싶기 때문입니다..

색상을 직접 사용하면 이 동작이 발생하지 않습니다.


내 질문은 다음과 같습니다

  • PS1에서 사용할 색상 코드를 인쇄하려면 어떻게 해야 합니까?에코 사용?
  • PS1을 조건부로 다른 색상으로 만들고 싶다면 가장 좋은 방법은 무엇입니까?
  • 이 동작이 나타나는 이유는 무엇입니까?

업데이트

분명히 말하자면 색상을 변경하고 싶기 때문에 echo를 사용하여 이 작업을 수행하고 싶습니다.조건부로.

이것이 제가 현재 가지고 있는 것입니다:

function setPs1Colors_start () {

    local previousExit=$?

    local ps1Color="\033[1;35m"
    local ps1FailBackground="\e[41m"

    echo -en $ps1Color

    if [[ previousExit -ne 0 ]]
    then
        echo -en $ps1FailBackground
    fi

}

function setPs1Colors_end () {
    local ps1DefaultColor="\033[0m"
    echo -en $ps1DefaultColor
}

export PS1='$(setPs1Colors_start)[$(date +%b\-%d\ %k:%M)][$(versionControlInfo)\W]\$$(setPs1Colors_end) '

답변1

\033[1;35m7자입니다. bash해당 7개의 문자가 실제로 null 너비를 가지고 있다고 추측할 수 없습니다. 그렇지 않은 경우 너비가 7열이라고 생각합니다.

편집 키를 사용할 때 커서를 이동하기 위해 커서 위치 지정 순서(위, 아래, 왼쪽, 오른쪽)를 사용하기 때문에 이 도구(또는 readline사용하는 기본 줄 편집기)는 화면의 현재 위치를 알고 싶어합니다.

따라서 프롬프트의 어떤 문자가 커서를 움직이지 않는지 알려주어야 합니다. 를 사용 하면 내부 내용의 너비가 0임을 쉘에 알려주는 를 bash사용하여 수행됩니다 .\[...\]

또한 프롬프트 확장은 ESC 문자로 bash인식되므로 \e를 사용할 필요가 없습니다 echo -e. 당신은 할 수 있습니다 :

PS1='\[\e[1;35m\] blah $ '

echo, 또는 그 이상을 사용해야 하는 경우 다음을 printf수행합니다.

PS1='\[$(if ...; then printf "$color1"; fi)\] blah $ '

또는:

PS1='$(if ...; then printf "\[$color1\]"; fi) blah $ '

에서는 's 와 zsh동일 하지만 문자 속성을 변경하는 지시문이 있으므로 다음 을 수행하는 것이 좋습니다.bash\[...\]%{...%}tcshzsh

PS1='%B%F{magenta}blah $ '

굵은 자홍색 전경의 경우. 또한 on 을 포함한 몇 가지 형태의 조건부 테스트가 있으므로 오류가 $?있는 red경우 녹색으로 작성할 수 있습니다.

PS1='%F{%(?:green:red%)}blah%f $ '

tcsh이 있지만 %B없습니다 %F{color}. 따라서 다음을 사용합니다.

set prompt = '%{\e[1;35m%}blah $ '

ksh88또는 에서는 pdksh다음을 수행합니다.

PS1=$(printf '\5\r\5\33[1;35m\5blah $ ')

이는 문자(여기서는 0x5)를 정의합니다.탈출하다성격. 그런 다음 한 쌍 사이에 텍스트를 포함하면 해당 텍스트가 표시되지 않음을 쉘에 알리게 됩니다. 0x5 이외의 모든 문자를 사용할 수 있지만 프롬프트에서 발생해서는 안 되며 mksh를 제외하고는 쉘이 실제로 (CR 문자와 함께) 문자를 쓰기 때문에 터미널에서 무시해야 합니다.

ksh93커서 위치 지정 순서는 하나만 사용합니다 BS(커서를 한 열 왼쪽으로 이동). 오른쪽으로 이동하려면 동일한 문자를 다시 그리면 됩니다. 따라서 커서 위치를 알 필요는 없으며 입력하는 각 문자의 너비만 알면 됩니다. 터미널이 자체적으로 여백을 감싸는 한 작동합니다. 따라서 이 경우 제대로 작동하지 않습니다.terminator예를 들어). 제어 순서가 포함된 프롬프트가 표시되는 경우 한 가지 부작용은 탭 정지가 제대로 정렬되지 않는다는 것입니다.

관련 정보