Bash
如何在底部提示啟動 XTerm?
啟動 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
。