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사용하는 기본 줄 편집기)는 화면의 현재 위치를 알고 싶어합니다.

따라서 프롬프트의 어떤 문자가 커서를 움직이지 않을 것인지 알려주어야 합니다. 이 bash작업은 it을 사용하여 수행되며 \[...\], 이는 내부 너비가 0임을 쉘에 알려줍니다.

또한 프롬프트 확장은 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 $ '

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

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

굵은 마젠타색 전경에 사용됩니다. 또한 on 을 포함한 몇 가지 형태의 조건부 테스트가 있으므로 if 오류, 녹색 else 는 $?다음 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 이외의 모든 문자를 사용할 수 있지만 프롬프트에 나타날 수 없으며 쉘이 실제로 (CR 문자와 함께) 쓰기 때문에 mksh를 제외한 터미널에서는 무시해야 합니다.

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

관련 정보