我一直在玩 bash,想知道如果我执行另一个命令是否可以使闪烁的文本停止。例如echo -e '\033[5mEXAMPLE\033[0m'
会输出闪烁的EXAMPLE
文字;但是,我想知道如果执行第二个命令是否可以使文本停止闪烁。
答案1
发送<ESC>[5m
序列告诉终端设置从现在开始显示的字符的闪烁属性。
在大多数终端上,<ESC>[25m
将其关闭,因为此后将发送的字符将具有其眨属性关闭。 ,与转弯<ESC>[0m
相同<ESC>[m
全部字符再现属性关闭,包括粗体、突出、颜色等。不仅仅是闪烁。
发送这些序列不会改变已经显示的内容。
为了使EXAMPLE
屏幕上的某个位置停止闪烁,您必须EXAMPLE
在同一位置发送一个新的闪烁,然后覆盖它。
例如:
printf '\r\33[5m%s\33[25m' EXAMPLE; sleep 5; printf '\r%s\n' EXAMPLE
将显示一个闪烁的EXAMPLE
,然后 5 秒后,将光标移回行的开头(CR 又名\r
将光标移动到开头)并用不闪烁的 覆盖它EXAMPLE
。
对于某些终端,还可以使用以下命令更改显示区域中所有字符的属性:<ESC><top>;<left>;<bottom>;<right>25$r
DECCARA 转义序列,如果未指定边界,则默认为整个屏幕。这DECSACE
转义序列可以发送来确定这两个<top>;<left>
和<bottom>;<right>
坐标是第一个和最后一个字符还是矩形区域的角点。
例子:
printf '\33[;;;;$r'
将消除整个屏幕上的所有闪烁。
要消除屏幕上某些特定连续文本的闪烁,您需要知道该文本的第一个和最后一个字符的坐标。
您可以使用转义序列查询光标位置<ESC>[6n
。
使用bash
,您可以执行此操作并<ESC>[<y>;<x>R
使用以下命令读取其响应:
getpos() { IFS=$'\e[;' read -rsdR -p $'\e[6n' _ _ "$2" "$1"; }
假设用户没有同时或之前输入任何内容,其中:
p
转义序列作为rompt发送- 我们告诉
read
禁用echo
,-s
以便响应不会显示在屏幕上 - 响应被读取
r
到R
d
限制符。 F
S
对任何<ESC>
、[
、字符进行字段分割;
,并将结果字段存储在_
、_
、$2
和$1
变量中。
所以你可以这样做:
printf '\33[5m%s\33[25m\n' 'Some earlier blinking text'
getpos x1 y1; printf '\33[5m%s\33[25m%s' EXAMPLE; getpos x2 y2
printf ' \33[5m%s\33[25m\n' 'Some extra blinking text'
echo 'Some more text'
后来,假设没有滚动:
printf '\33[%s;%s;%s;%s;25$r' "$y1" "$x1" "$y2" "$x2"
在上述所有内容中,我们使用printf
而不是echo
使其可以跨不同的 shell 或不同的构建/版本/设置进行移植。通过printf
bash 和大多数其他printf
实现的内置功能,您可以\e
使用\33
.
与这里提到的其他转义序列相比,它的支持范围要小得多。另请注意,即使主机终端支持,tmux
也不支持它。screen
虽然可以说服他们将序列传递给主机,但这仍然无法在分割窗口中正常工作。
答案2
闪烁的文字
tput blink
恢复特征
tput sgr0
例如
tput blink; echo This is blinking text; tput sgr0
或者
blink=$(tput blink) noblink=$(tput sgr0)
printf '%s\n' "Here we go: ${blink}this blinks${noblink} and this is steady"
有了这个功能,并且能够将光标向上移动 ( tput cuu1
) 甚至移动到绝对位置(tput cup Y X
- (0,0) 位于左上角),您就可以随意用非闪烁文本覆盖闪烁文本。
值得阅读更多关于 terminfo 的内容;您甚至可以保存当前光标位置,移动到新位置写入文本,然后恢复该位置。如果您的终端不支持这一点,那么只要与$TERM
现实相匹配,您就会简单地回退到近似值