将bash输入保持在屏幕的第一行


12

我想将bash命令提示符输入保持在屏幕顶部,以便将较旧命令的输出向下而不是向上推。

我该如何实现?


6
那么,如果您cat有文件,那将是相反的顺序?
混乱

不,但是我希望将输出的大块数据下推
汤姆·普赖斯

1
bash无法做到这一点,因为bash甚至都不知道屏幕位置:它只是写入输出文件。您将需要一个知道bash的交互式提示的终端仿真器,以便知道何时重置光标以及何时滚动窗口。
chepner

谢谢@chepner,我正在重新讨论这个问题,您的评论使我看不到bash并开始查看整个显示堆栈。我想保留在基于文本的虚拟控制台中(即没有X Windows),所以现在暂时避免使用终端模拟器,但是对于我的GUI会话,我一定会研究一下。万一有人遇到这个问题,我想是和tty有关,我目前正在这里寻找灵感... linusakesson.net/programming/tty
汤姆·普赖斯

Answers:


7

将这些行添加到您的.bashrc

prompt_on_top() {
  tput cup 0 0
  tput el
  tput el1
}

pre_cmd() {
  if [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] || [ -n "$COMP_LINE" ]; then
    return
  fi
  printf "\33[2J"
}

PROMPT_COMMAND="prompt_on_top"
trap 'pre_cmd' DEBUG

bash具有PROMPT_COMMAND,其中包含命令的命令将在bashshow提示符之前执行。在这里,我们将其设置为function prompt_on_top,使用tput将光标设置在屏幕顶部。

bash也有一种在执行任何命令之前执行命令的方法,使用陷阱处理signal DEBUG。在这里,我们将其设置为function pre_cmd,它将清除旧屏幕,并且如果完成(COMP_LINE不为空)或在中运行命令,则不执行任何操作BASH_PROMPT


这种方法有一个局限性,如果命令输出太长而无法容纳在屏幕中,那么该输出将被操作覆盖prompt_on_top。在这种情况下,您需要将输出传递给寻呼机以读取整个输出。


1
感谢您的解释清楚,我有很多东西可以阅读和学习。我已经测试了您的脚本,目前它可以有效擦除命令之间屏幕上的旧输出。我想将先前的输出保留在屏幕上的提示下方,并在提示和旧的输出之间插入新的输出,从而将旧的输出向下推到屏幕上。
汤姆·普赖斯

对于那些通过网络搜索来到这里的人,此代码github.com/swirepe/alwaysontop还“使您的bash提示保持在屏幕顶部”,以及一些其他功能。但是,不能回答原始问题:与cuonglm的代码一样,较旧的命令输出也将被删除。
WillC '18年

该解决方案的另一个缺点是,您对最后执行的命令没有反馈。也就是说,cat file将显示file内容,但是您不会立即得到执行的确切命令的反馈。理想情况下,提示后将执行命令的非扩展+扩展版本,然后是std输出。
心理奴隶
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.