질문:
명령줄 프롬프트를 엽니다.
문자를 여러 번 입력하세요.
입력한 텍스트는 새 줄로 줄 바꿈되지 않고 동일한 줄로 줄 바꿈됩니다.
이제 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;35m
7자입니다. 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
\[...\]
%{...%}
tcsh
zsh
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
예를 들어). 제어 순서가 포함된 프롬프트가 나타나면 한 가지 부작용은 탭 정지가 올바르게 정렬되지 않는다는 것입니다.