我制作了一个脚本,每 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 2
(OSC
是ESC ]
)。
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