OpenBSD에서 녹색/빨간색 터미널을 얻는 방법은 무엇입니까?

OpenBSD에서 녹색/빨간색 터미널을 얻는 방법은 무엇입니까?

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

문제는 다음 bashPROMPT_COMMAND같습니다.

PS1='\[$(if (($?)); then tput setaf 1; else tput setaf 2; fi)\]'\
'[\u@\h \w]\['"$(tput sgr0)"'\]'

¹ 경고: 에서는 이것을 테스트하지 않았지만 피하고 에서 작업 ksh할 수 있습니다 .PROMPT_COMMANDbash

² tput시스템의 terminfo데이터베이스를 사용하십시오. terminfo가 올바르게 설치된 경우 일반적으로 하드코딩된 이스케이프 시퀀스보다 이식성과 유지 관리가 더 쉽습니다.

관련 정보