Linux 시스템의 경우 다음을 사용할 수 있습니다.
# vi ~/.bashrc # red/green terminal colors regarding exit code
export PROMPT_COMMAND='PS1="`
if [[ \$? = "0" ]];
then echo "\\[\\033[0;32m\\]";
else echo "\\[\\033[0;31m\\]";
fi`[\u@\h \w]\[\e[m\] "'
export PS1
종료 코드가 0이면 녹색 터미널이 표시되고, 종료 코드가 0이 아니면 빨간색 프롬프트가 표시됩니다.
OpenBSD에서 이 작업을 어떻게 수행할 수 있나요? (기본값 ksh)
(저는 성공하지 못했습니다. 랩톱에서 OpenBSD 시스템으로 SSH를 사용하여 ubuntu/gnome-terminal을 사용했습니다.)
답변1
각 셸에는 프롬프트를 확장하는 고유한 방법이 있습니다. OpenBSD의 ksh는 pdksh입니다. 프롬프트 설정 보기수동, PS1
매개변수 아래.
ksh는 프롬프트를 인쇄하기 전에 값에 대해 $
매개변수 대체, 명령 대체 및 산술 대체(모든 확장)를 수행하여 작동합니다. PS1
따라서 한 번만 설정하면 PS1
값이 매번 다시 생성됩니다. ( shopt -s promptvars
당신이 직접 입력하면 bash에서도 이 작업을 수행할 수 있습니다 .bashrc
.)
OpenBSD의 ksh는 bash와 유사한 백슬래시 이스케이프를 지원합니다. 다른 ksh 버전의 경우 bash 프롬프트 이스케이프 시퀀스를 $
대체 시퀀스 로 변환해야 합니다 .
PS1='$(if (($? == 0)); then print -n "\\033[32m"; else print -n "\\033[31m"; fi)'
PS1="$PS1"'[\u@\h \w]'$(print '\033')'[0m '
위의 간단한 번역에는 몇 가지 결함이 있습니다.
- 분석할 때마다 프로세스를 분기합니다
$?
. 이를 피할 수 있는 방법이 있지만 ksh88에서는 짜증납니다. - 너비가 0인 제어 시퀀스로 인해 다시 그리기 오류가 발생합니다. 이는 매뉴얼에 기록된 심각한 해킹으로 피할 수 있습니다.
다음은 산술을 사용하여 서브쉘 생성을 방지하고 인쇄할 수 없는 시퀀스를 분리하는 좀 더 복잡한 코드입니다.
escape=$(print '\033')
ctrla=$(print '\001')
PS1=$(print '\001\015')
PS1=$PS1$ctrla$escape'[$(($? ? 31 : 32))m'$ctrla
PS1=$PS1'[\u@\h \w]'
PS1=$PS1$ctrla$escape'[0m'$ctrla' '
답변2
문제는 다음 bash
과 PROMPT_COMMAND
같습니다.
PS1='\[$(if (($?)); then tput setaf 1; else tput setaf 2; fi)\]'\
'[\u@\h \w]\['"$(tput sgr0)"'\]'
¹ 경고: 에서는 이것을 테스트하지 않았지만 피하고 에서 작업 ksh
할 수 있습니다 .PROMPT_COMMAND
bash
² tput
시스템의 terminfo
데이터베이스를 사용하십시오. terminfo가 올바르게 설치된 경우 일반적으로 하드코딩된 이스케이프 시퀀스보다 이식성과 유지 관리가 더 쉽습니다.