Bash

如何在底部提示啟動 XTerm?

  • March 13, 2022

啟動 XTerm 時,提示從終端的第一行開始。執行命令時,提示會向下移動直到到達底部,從那時起它就一直呆在那裡(甚至沒有Shift-Page Down或者滑鼠可以改變它)。而不是讓終端生命週期的開始是“特殊的” **,提示應該總是在終端的底部。**請注意,我有一個多行提示

當然,它應該像以前一樣工作(可調整大小,可滾動,輸出中沒有不必要的換行符,並且沒有輸出神秘地消失),所以PROMPT_COMMAND='echo;echo;...'或類似的不是一種選擇。理想情況下,解決方案不應該是特定於 shell 的。

**編輯:**目前的解決方案,雖然在簡單的情況下工作,但有一些問題:

  • 它是Bash 特定的。理想的解決方案應該可以移植到其他 shell。
  • **如果其他程序修改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您可能在 shell 中以其他方式定義的任何變數。

由於大多數終端cup功能是相同的\e[y;xH,您也可以對其進行硬編碼:

PS1='\[\e[$LINES;1H\]'$PS1

如果您希望它可以安全地防止以後重置 PS1,您也可以使用該PROMPT_COMMAND變數。如果設置,則在輸出提示之前作為命令執行。所以效果也可以通過

PROMPT_COMMAND='(retval=$?;tput cup "$LINES";exit $retval)'

當然,雖然重置PS1不會影響這一點,但其他一些軟體也可能會發生變化PROMPT_COMMAND

引用自:https://unix.stackexchange.com/questions/153102