쉘 프롬프트에서 프롬프트 아래에 내용을 표시하시겠습니까?

쉘 프롬프트에서 프롬프트 아래에 내용을 표시하시겠습니까?

내 프롬프트가 다음과 같다고 가정해 보겠습니다(_는 내 커서를 나타냄).

~ % _

이렇게 보이게 하는 방법 없을까요

~ % _
[some status]

이 질문은 원래 zsh에 관한 것이었지만 이제는 다른 답변이 있습니다.

답변1

다음 설정이 작동하는 것 같습니다. 명령줄이 첫 번째 줄을 초과하면 두 번째 줄의 텍스트가 사라집니다. 이 preexec기능은 명령을 실행하기 전에 두 번째 줄을 지웁니다. 이를 유지하려면 로 변경하십시오 preexec () { echo; }.

terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]
PS1_2='[some status]'
PS1="%{$terminfo_down_sc$PS1_2$terminfo[rc]%}%~ %# "
preexec () { print -rn -- $terminfo[el]; }

%이스케이프는 zsh 매뉴얼( man zshmisc)에 문서화되어 있습니다.

Terminfo는 터미널 액세스 API입니다. Zsh에는 terminfo터미널 설명 데이터베이스에 액세스하는 모듈이 있습니다. $terminfo[$cap]터미널의 기능을 실행하기 위해 전송되는 문자 시퀀스 $cap(예: 명령 실행 )입니다. $cap자세한 내용은 man 5 terminfo(Linux의 섹션 번호는 다른 unice와 다를 수 있음)을 참조하세요.

작업 순서는 다음과 같습니다. 커서를 한 줄 아래로 이동한 cud1다음 ( cuu1) 커서 위치 를 sc저장합니다( ). 커서를 한 줄 아래로 이동합니다 [some status]. 시작 상위 및 하위 비트는 프롬프트가 화면의 맨 아래 행에 있는 경우에만 필요합니다. preexec 라인은 el명령의 출력과 혼동되지 않도록 두 번째 라인( )을 제거합니다.

텍스트의 두 번째 줄이 터미널보다 넓으면 디스플레이가 깨질 수 있습니다. 필요한 경우 Ctrl+를 사용하여 수정하세요 .L

답변2

이는 bashGilles의 zsh 솔루션과 동일합니다. Bash에는 기본 terminfo 모듈이 없지만 이 tput명령(함께 번들로 제공됨 terminfo)은 거의 동일한 작업을 수행합니다.

PS1_line1='\w \$ '
PS1_line2='[some status]'

if (tput cuu1 && tput sc && tput rc && tput el) >/dev/null 2>&1
then
    PS1="
\[$(tput cuu1; tput sc)\]
\[${PS1_line2}$(tput rc)\]${PS1_line1}"
    PS2="\[$(tput el)\]> "
    trap 'tput el' DEBUG
else
    PS1="$PS1_line2 :: $PS1_line1"
fi

터미널이 이러한 기능 중 하나를 지원하지 않으면 한 줄 프롬프트로 대체됩니다.

trap라인은 preexeczsh 기능을 에뮬레이트하는 깔끔한 방법입니다. 바라보다https://superuser.com/questions/175799/더 많은 정보를 알고 싶습니다.

편집하다: Gilles의 의견을 바탕으로 스크립트를 개선했습니다.

관련 정보