在另一个“屏幕”上显示输出并在完成后恢复正常

Tyi*_*ilo 9 bash terminal

我想要与less vim nano等使用类似的行为。

这可以用 bash 实现吗?

Kei*_*son 10

如果你的终端仿真器支持的话,您可以通过所用相同的机制做到这一点lessvim等,即tite的termcap能力(smcup以及rmcup在更现代的terminfo)。它们分别从主屏幕切换到辅助屏幕,然后再切换回主屏幕。

如果您的系统有该tput命令,您可以使用:

tput smcup # switch to secondary screen
...
tput rmcup # switch back to primary screen
Run Code Online (Sandbox Code Playgroud)

否则,对于xterm,并且可能对于大多数其他终端仿真器,这是:

printf '\e[7\e[?47h'
Run Code Online (Sandbox Code Playgroud)

应该切换到辅助屏幕,这是:

printf '\e[2J\e[?47l\e8'
Run Code Online (Sandbox Code Playgroud)

应该切换回主(并将光标放回原来的位置)。

tcsh 有一个内置echotc命令,所以你可以这样做:

tcsh -c 'echotc ti'
...
tcsh -c 'echotc te'
Run Code Online (Sandbox Code Playgroud)

(或者,echotc如果您碰巧正在使用 tcsh,则直接使用)。

  • 如果您打算对代码进行硬编码而不是使用 `tput`,请尝试使用现代的 `1049` 而不是 `47`。这是由 Xterm 引入的,并得到其他一些终端仿真器的支持。它在切换到它时清除备用屏幕,并在切换回时将内容留在原处(因此您可以在全屏程序退出后查看/复制内容)。 (2认同)
  • 为了健壮性,如果您的脚本语言支持它,即使您的程序过早退出,也要安排切换到主显示。例如,在 Bash 脚本中,您可以使用 `trap 'tput rmcup' EXIT` 安装信号处理程序。 (2认同)

Gil*_*il' 5

这就是所谓的“交替屏幕”(并作为牛逼Ø p 谷歌命中表明,你是喜欢这个功能异常)。一些终端支持两种屏幕缓冲区,一种用于全屏应用程序,另一种用于面向行的应用程序。Bash 对它们一无所知。如果命令只是向终端发出输出,您可以使用终端控制序列切换到辅助屏幕并返回(这些命令记录在xterm ctlseqs 中)。

printf '\e[?47h'; mycommand; printf '\e[?47l'
Run Code Online (Sandbox Code Playgroud)

请注意,备用屏幕没有回滚,因此您只会看到最后一屏的输出。如果这是一个问题,只需做简单的事情:

mycommand | less 
Run Code Online (Sandbox Code Playgroud)

只有两个屏幕缓冲区。如果您想要更多,请使用适当的屏幕多路复用器,例如ScreenTmux