XTerm을 시작하면 터미널의 첫 번째 줄에서 프롬프트가 시작됩니다. 명령을 바닥에 닿을 때까지 아래로 신속한 이동을 실행 때에 그때부터가 (심지어 유지 Shift– Page Down또는 마우스를 변경할 수 있습니다). 터미널 수명이 “특별”하게되기보다는 프롬프트는 항상 터미널의 맨 아래에 있어야합니다. 나는이 점에 유의하시기 바랍니다 멀티 라인 프롬프트 .
물론 이전과 같이 작동해야합니다 (크기 조정 가능, 스크롤 가능, 출력에 불필요한 줄 바꿈이없고 출력이 신비하게 사라지지 않음). 그렇 PROMPT_COMMAND='echo;echo;...'
거나 유사한 옵션은 아닙니다. 이 솔루션은 이상적으로 쉘 전용이 아니어야합니다.
편집 : 현재 솔루션은 간단한 경우에서 작업하는 동안, 몇 가지 문제가 있습니다 :
- 그것은이다 배쉬 특정 . 이상적인 솔루션은 다른 쉘에 이식 가능해야합니다.
- 그것은 다른 프로세스 수정하면 실패합니다
PS1
. 예를 들어 virtualenv(virtualenv)
는 시작 부분 에 추가 되며PS1
접힌 부분 바로 위에서 항상 사라집니다. - Ctrl– l이제 기록의 마지막 페이지를 제거 합니다.
XTerm을 분기시키지 않고 이러한 문제를 피할 수있는 방법이 있습니까?
답변
를 사용 bash
하는 경우 다음이 트릭을 수행해야합니다.
TOLASTLINE=$(tput cup "$LINES")
PS1="\[$TOLASTLINE\]$PS1"
또는 ( tput
각 프롬프트 전에 하나의 명령을 실행하므로 효율적이지 않지만 터미널 창의 크기를 조정 한 후에 작동합니다).
PS1='\[$(tput cup "$LINES")\]'$PS1
tput
종료 코드를 변경 하지 않으려면 명시 적으로 저장하고 재설정하십시오.
PS1='\[$(retval=$?;tput cup "$LINES";exit $retval)\]'$PS1
변수 retval
는 지역적입니다. retval
쉘에서 다르게 정의한 변수 에는 영향을 미치지 않습니다 .
대부분의 터미널 cup
기능은 동일 하므로 \e[y;xH
하드 코딩 할 수도 있습니다.
PS1='\[\e[$LINES;1H\]'$PS1
나중에 PS1을 재설정하지 않아도 안전하려면 PROMPT_COMMAND
변수 를 사용할 수도 있습니다 . 설정된 경우 프롬프트가 출력 되기 전에 명령으로 실행됩니다 . 따라서 효과는
PROMPT_COMMAND='(retval=$?;tput cup "$LINES";exit $retval)'
물론 재설정 PS1
해도 영향을 미치지 않지만 다른 소프트웨어도 변경 될 수 있습니다 PROMPT_COMMAND
.
답변
이전 답변을 약간 단순화하면 다음과 같이 실행하는 것이 더 쉽다는 것을 알았습니다.
tput cup $LINES
의 시작에서 .bashrc
또는 .zshrc
. 그냥 일을 해요.
장점 :
- 쉘을 시작할 때 한 번만 인쇄됩니다.
단점 :
- ^ L로 화면을 지우면 인쇄되지 않으며 앨리어싱
clear
이clear; tput ...
도움이되지 않습니다. - 터미널 크기를 조정할 때 프롬프트가 다른 곳으로 이동
답변
사용하는 답변 $LINES
은 불필요하게 이식성이 없습니다. 에서와 같이 위치를 임의로 큰 줄 번호로 설정 resize
하도록 요청할 수 있습니다 xterm
.
tput cup 9999 0
( 스크롤 백을 무시하고 10 만 줄보다 작은 창이 있다고 가정합니다 ).
문자열은 창 크기를 조정하는 부작용으로 변경되지 않으므로이를 한 번 계산하여 프롬프트 문자열에 상수로 붙여 넣을 수 있습니다.
TPUT_END=$(tput cup 9999 0)
그리고 나중에
PS1="${TPUT_END} myprompt: "
당신의 취향에 따라.
다른 프로세스 수정에 관해서는 PS1
: PS1
변경 후 원하는 대로 다시 계산 해야합니다. 그러나 질문 에서 변경해야 할 부분 을 지적하기에 충분한 세부 정보가 없습니다 .
마지막으로 탭 완성의 동작은 bash의 가정으로 인해 이러한 종류의 변경과 맞지 않습니다.