在 bash 中在终端的特定空间打印一些内容

在 bash 中在终端的特定空间打印一些内容

我制作了一个脚本,每 10 分钟在命令行上告诉我笔记本电脑的电池寿命,但问题是它在命令行上回显它。我希望它能够将其打印在例如终端的右上角。

那可能吗?

示例:这是终端窗口:

=====================
|texttexttexttexttex|
|t                  |
|moretext           |
|somethingsomething |
|me@me:~$...        |
=====================

命令执行后,结果如下:

=====================
|texttexttextBAT-50%|
|t                  |
|moretext           |
|somethingsomething |
|me@me:~$...        |
=====================

所以它会覆盖那里写的任何内容。

答案1

使用终端转义序列移动光标。几乎所有终端都使用一组通用的转义序列,这些序列在这里就足够了,由 ANSI 标准化并在 VT100 中流行。但您可以使用术语信息数据库来查找终端的转义序列,具有可移植性和可读性的双重好处。您可以使用tput发射效用术语信息功能

print_in_top_right () {
  local columns=$(tput cols)           # get the terminal width
  local text=${1:0:$columns}           # truncate the text to fit on a line if needed
  tput sc                              # Save the Cursor position
  tput cup 0 $((columns - ${#text}))   # move the CUrsor Position to the top line, with just enough space for $text on the right
  printf %s "$text"
  tput rc                              # Restore the Cursor position saved by sc
}

请注意,一旦终端滚动,这段文本就会随之滚动。没有通用的工具可以将一些文本叠加到终端上。如果您想要这样做,您需要一个具有此功能的终端仿真器,该仿真器通常为此目的预留一条专用线路。大多数图形终端模拟器都可以让您看到窗口标题,您可以使用xterm 兼容的转义序列 OSC 2OSCESC ])。

set_window_title () {
  printf '\e]2;%s\007' "$1"
}

答案2

要在终端上的第 11 行第 31 列写入 MSG,并将 shell 提示符放回窗口底部:

echo "$( tput cup 10 30 )${MSG}$( tput cup ${LINES} 0))" && echo

答案3

这应该对你有用假设BATTERY=50

它会找到终端的列数,然后调整文本的光标并打印“BAT $BATTERY%”

echo "$(tput cup 0 $(expr $(tput cols) - 7))BAT $BATTERY%" && echo

相关内容