나는 bash 프롬프트에서 작업 중입니다. 또한 읽기 쉽고 유지 관리하기 쉽도록 프롬프트를 지능적으로 만들려고 노력합니다. 이는 큰 것이 없다는 것을 의미합니다 export PS1
.
다양한 소스(포함이 문제) bash가 긴 명령으로 프롬프트를 덮어쓰지 않도록 알 수 있도록 주변 서식 지정 의 필요성 \[
과 관련 내용을 참조하세요.\]
문자열을 생성할 때 마지막 명령( )의 종료 상태를 빨간색으로 표시하거나, 0이면 아무것도 표시하지 않으려는 PROMPT_LAST_EXIT_STATUS
의도입니다 . 이것은 작동하지만 텍스트 s 및 s가 프롬프트에 표시되고 긴 명령 문제가 지속됩니다. 어딘가에 회피적인 문제일 수도 있지만 아직 발견하지 못했습니다.$?
$?
[
]
다음 코드는 에 있습니다 ~/.bashrc
.
prompt_last_exit_status () {
PROMPT_LAST_EXIT_STATUS="${?}";
if [[ ${PROMPT_LAST_EXIT_STATUS} == "0" ]];
then
PROMPT_LAST_EXIT_STATUS=
else
PROMPT_LAST_EXIT_STATUS=\[$(tput setaf 1)$(tput bold)\]${PROMPT_LAST_EXIT_STATUS}
PROMPT_LAST_EXIT_STATUS+=\[$(tput sgr0)\]
PROMPT_LAST_EXIT_STATUS+=" "
fi;
}
prompt_command () {
prompt_last_exit_status
}
export PROMPT_COMMAND=prompt_command
PS1="\${PROMPT_LAST_EXIT_STATUS}"
PS1+="\[$(tput setaf 6)$(tput bold)\]\w"
PS1+="\[$(tput sgr0)\] \$ \[$(tput sgr0)\]"
export PS1
답변1
귀하의 할당 은 인용되지 않았으므로 문자열에 and를 PROMPT_LAST_EXIT_STATUS
넣지 않고 단지 and 입니다 ( s는 이스케이프 문자로 간주되기 때문입니다).\[
\]
[
]
\
비교하다:
$ foo=\[hello\]
$ echo "$foo"
[hello]
비교:
$ foo="\[hello\]"
$ echo "$foo"
\[hello\]
그뿐만 아니라 매개변수 확장(프롬프트 문자열에 변수 삽입)은 프롬프트 특수 문자 확장 후에 발생합니다. 따라서 변수에 \[
and 를 넣는 것은 확장 되면 더 이상 특별하지 않기 때문에 작동하지 않습니다 . 유효한 대안은 색상 설정을 무조건적으로 만드는 것입니다. 예를 들면 다음과 같습니다.\]
PROMPT_LAST_EXIT_STATUS
$PROMPT_LAST_EXIT_STATUS
\[
\]
prompt_last_exit_status () {
PROMPT_LAST_EXIT_STATUS="${?}"
if [[ ${PROMPT_LAST_EXIT_STATUS} == "0" ]]
then
PROMPT_LAST_EXIT_STATUS=
else
PROMPT_LAST_EXIT_STATUS+=" "
fi
}
prompt_command () {
prompt_last_exit_status
}
export PROMPT_COMMAND=prompt_command
PS1="\[$(tput setaf 1)$(tput bold)\]\${PROMPT_LAST_EXIT_STATUS}\[$(tput sgr0)\]"
PS1+="\[$(tput setaf 6)$(tput bold)\]\w"
PS1+="\[$(tput sgr0)\] \$ \[$(tput sgr0)\]"
export PS1
답변2
PS1은 \[
and를 \]
1과 2로 평가합니다. \[
PS1의 색상이 너무 길어서 및 색상을 넣지 않으려면 PS1에서 이미 1과 2가 포함된 변수를 사용하도록 할 수 있습니다. 을 사용하면 $'\001'
변수에 1이 포함되고 를 사용하면 2가 포함됩니다 $'\002'
. 작성된 대로 작동하도록 코드를 수정했습니다.
prompt_last_exit_status () {
PROMPT_LAST_EXIT_STATUS=$?
if [[ ${PROMPT_LAST_EXIT_STATUS} == "0" ]]; then
PROMPT_LAST_EXIT_STATUS=
else
PROMPT_LAST_EXIT_STATUS=$'\001'$(tput setaf 1)$(tput bold)$'\002'$PROMPT_LAST_EXIT_STATUS
PROMPT_LAST_EXIT_STATUS+=$'\001'$(tput sgr0)$'\002'
PROMPT_LAST_EXIT_STATUS+=" "
fi
}
prompt_command () {
prompt_last_exit_status
}
export PROMPT_COMMAND=prompt_command
PS1='$PROMPT_LAST_EXIT_STATUS'
PS1+="\[$(tput setaf 6)$(tput bold)\]\w"
PS1+="\[$(tput sgr0)\] \$ \[$(tput sgr0)\]"
export PS1
추가 정보
PS1이 평가될 때 호출될 함수를 PS1이 참조하도록 할 수도 있습니다.
print_status() {
printf "\001$(tput setaf 1)$(tput bold)\002$?\001$(tput sgr0)\002"
}
export -f print_status
export PS1='$(print_status) '
참고: 함수 내보내기를 print_status
수행하면 su
PS1이 의존하는 함수를 참조할 수 있습니다. 또한 내보낸 함수가 표준 Bourne 셸(sh)에서 작동하는지 확인하세요. git과 vim은 이러한 셸을 사용하고 이러한 기능을 사용하려고 시도하기 때문입니다.