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