매번 일부 명령을 실행하도록 PS1을 수정하고 싶습니다. 내가 원한다고 가정해 보겠습니다. 마지막으로 실행된 명령이 성공하면 PS1 끝에 녹색 스마일이 추가되고, 그렇지 않으면 스마일이 빨간색이 되어야 합니다.
나는 그것을 함수로 추출했습니다.
function exit_smile {
EXITSTATUS="$?"
RED="\[\e[1;31m\]"
GREEN="\[\e[32;1m\]"
if [ "${EXITSTATUS}" -eq 0 ]
then
SMILE="${GREEN}:)"
else
SMILE="${RED}:("
fi
echo -n "$SMILE"
}
그런 다음 PS1 변수를 수정할 때 및 를 사용하려고 시도 하지만 `exit_smile`
PS1을 수정하거나 색상 대신 텍스트를 인쇄할 때 \$(exit_smile)
한 번만 수행합니다 . 예를 들어\[\e...\]
PROMPT="\u@\h \W"
PS1="${PROMPT} \$ \$(exit_smile) ${OFF}\n"
주어진 username@hostname ~ $ \[\e[32;1m\]:)
내가 무엇을 놓치고 있습니까?
답변1
이것이 버전 간에 변경되었는지는 확실하지 않지만 (*) 내 Bash 매뉴얼 페이지는 다음과 같습니다.
Bash를 사용하면 다음과 같이 디코딩되는 백슬래시로 이스케이프된 특수 문자를 삽입하여 이러한 프롬프트 문자열을 사용자 정의할 수 있습니다.
(목록에는 등이 포함되어
\e
있습니다\[
.\]
)뒤쪽에문자열은 디코딩되고 매개변수 확장, 명령 대체 등을 통해 확장됩니다.
\[..\]
즉 , 명령 대체에서 나올 수 없고 명령 대체보다 앞에 있어야 함을 의미합니다 .
\u
(이것은 또한 명령 대체에 대한 인수로 또는 를 사용할 수 있으며 명령이 실행되기 전에 대체된다는 것을 의미합니다 . 그리고 명령 대체를 넣는 것이 무엇을 할지 \w
모르겠습니다 ... 다른 경우에 더 유용할 것입니다. \[..\]
방법은 대략 의미가 있습니다.
따라서 색상 코드를 별도의 확장자에 넣어 수동으로 보호해야 합니다 \[..\]
. 명령 대체 대신 변수를 사용하고 $'...'
확장을 사용하여 ESC 문자를 가져옵니다.
prompt_smile() {
if [ "$?" = 0 ] ; then
smile=' :) '
smilecolor=$'\e[1;32m'
else
smile=' :( '
smilecolor=$'\e[1;31m'
fi
normalcolor=$'\e[0m'
}
PROMPT_COMMAND=prompt_smile
PS1='\u@\h \W \$ \[$smilecolor\]$smile\[$normalcolor\]\n'
(*이것을 알고 싶은 이유는 나이가 많고유사하지만 중복되지 않는 질문\[..\]
확장 프로그램에서 출력되는 것 같습니다)