6.2. 光标移动

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 节,了解这些代码的更广泛使用。