l0b*_*0b0 14 bash terminal xterm
启动 XTerm 时,提示从终端的第一行开始。运行命令时,提示会向下移动,直到到达底部,然后它就停留在那里(甚至Shift-Page Down或者鼠标可以改变它)。而不是让终端生命周期的开始是“特殊的” ,提示应该总是在终端的底部。请注意,我有一个多行提示。
当然,它应该像以前一样工作(可调整大小,可滚动,输出中没有不必要的换行符,并且没有输出神秘消失),所以PROMPT_COMMAND='echo;echo;...'
或类似的不是一个选项。理想情况下,解决方案不应该是特定于 shell 的。
编辑:在目前的解决方案,在简单的情况下工作时,有几个问题:
PS1
。一个例子是的virtualenv,这增加了(virtualenv)
在开始的PS1
,然后总是消失只是倍以上。除了分叉 XTerm 之外,有没有办法避免这些问题?
cel*_*chk 12
如果使用bash
,以下应该可以解决问题:
TOLASTLINE=$(tput cup "$LINES")
PS1="\[$TOLASTLINE\]$PS1"
Run Code Online (Sandbox Code Playgroud)
或者(效率较低,因为它tput
在每个提示之前运行一个命令,但在调整终端窗口大小后工作):
PS1='\[$(tput cup "$LINES")\]'$PS1
Run Code Online (Sandbox Code Playgroud)
为了防止tput
更改退出代码,您可以显式保存并重置它:
PS1='\[$(retval=$?;tput cup "$LINES";exit $retval)\]'$PS1
Run Code Online (Sandbox Code Playgroud)
注意变量retval
是局部的;它不会影响retval
您可能在 shell 中以其他方式定义的任何变量。
由于大多数终端cup
功能相同\e[y;xH
,您也可以对其进行硬编码:
PS1='\[\e[$LINES;1H\]'$PS1
Run Code Online (Sandbox Code Playgroud)
如果您希望它不会在以后重置 PS1 时安全,您也可以使用该PROMPT_COMMAND
变量。如果设置,则在输出提示之前作为命令运行。所以效果也可以通过
PROMPT_COMMAND='(retval=$?;tput cup "$LINES";exit $retval)'
Run Code Online (Sandbox Code Playgroud)
当然,虽然重置PS1
不会影响这个,但其他一些软件也可能会改变PROMPT_COMMAND
。