ANSI 转义序列允许您随意在屏幕上移动光标。这对于 shell 脚本生成的全屏用户界面非常有用,但也可以在提示符中使用。移动转义序列如下:
- Position the Cursor:
\033[<L>;<C>H
Or
\033[<L>;<C>f
puts the cursor at line L and column C.
- Move the cursor up N lines:
\033[<N>A
- Move the cursor down N lines:
\033[<N>B
- Move the cursor forward N columns:
\033[<N>C
- Move the cursor backward N columns:
\033[<N>D
- Clear the screen, move to (0,0):
\033[2J
- Erase to end of line:
\033[K
- Save cursor position:
\033[s
- Restore cursor position:
\033[u |
后两个代码不被许多终端模拟器所支持。据我所知,唯一支持它们的终端模拟器是 xterm 和 nxterm - 即使大多数终端模拟器都是基于 xterm 代码的。据我所知,rxvt、kvt、xiterm 和 Eterm 不支持它们。它们在控制台上受支持。
尝试在提示符下输入以下代码行(如果提示符在终端的下方几行,那么当您输入此代码时,它的作用会更清楚)echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D"这应该将光标向上移动七行,打印单词“BASH”,然后返回到它开始的位置以产生一个正常的提示符。这不是一个提示符:这只是一个在屏幕上移动光标的演示,使用颜色来强调所做的事情。
将其保存在名为“clock”的文件中
#!/bin/bash
function prompt_command {
let prompt_x=$COLUMNS-5
}
PROMPT_COMMAND=prompt_command
function clock {
local BLUE="\[\033[0;34m\]"
local RED="\[\033[0;31m\]"
local LIGHT_RED="\[\033[1;31m\]"
local WHITE="\[\033[1;37m\]"
local NO_COLOUR="\[\033[0m\]"
case $TERM in
xterm*)
TITLEBAR='\[\033]0;\u@\h:\w\007\]'
;;
*)
TITLEBAR=""
;;
esac
PS1="${TITLEBAR}\
\[\033[s\033[1;\$(echo -n \${prompt_x})H\]\
$BLUE[$LIGHT_RED\$(date +%H%M)$BLUE]\[\033[u\033[1A\]
$BLUE[$LIGHT_RED\u@\h:\w$BLUE]\
$WHITE\$$NO_COLOUR "
PS2='> '
PS4='+ '
} |
这个提示符非常简单,除了它在终端的右上角保留一个 24 小时时钟(即使终端大小被调整)。这在我不接受保存和恢复光标位置代码的终端模拟器上不起作用。如果您尝试在任何这些终端模拟器中运行此提示符,时钟将正确显示,但提示符将停留在终端的第二行。
另请参阅第 12.9 节,了解这些代码的更广泛使用。