我一直在玩 bash,想知道如果我执行另一个命令是否可以使闪烁的文本停止。例如echo -e '\033[5mEXAMPLE\033[0m'
会输出闪烁的EXAMPLE
文字;但是,我想知道如果执行第二个命令是否可以使文本停止闪烁。
发送<ESC>[5m
序列告诉终端设置从现在开始显示的字符的闪烁属性。
在大多数终端上,<ESC>[25m
将其关闭,因为此后发送的字符将关闭其闪烁属性。,与关闭所有<ESC>[0m
字符呈现属性相同,包括粗体、突出、颜色等。不仅仅是闪烁。<ESC>[m
发送这些序列不会改变已经显示的内容。
\n为了使EXAMPLE
屏幕上的某个位置停止闪烁,您必须EXAMPLE
在同一位置发送一个新的闪烁并覆盖它。
例如:
\nprintf \'\\r\\33[5m%s\\33[25m\' EXAMPLE; sleep 5; printf \'\\r%s\\n\' EXAMPLE\n
Run Code Online (Sandbox Code Playgroud)\n将显示一个闪烁的EXAMPLE
,然后 5 秒后,将光标移回行的开头(CR 又名\\r
将光标移动到开头)并用不闪烁的 覆盖它EXAMPLE
。
<ESC><top>;<left>;<bottom>;<right>25$r
对于某些终端\xc2\xb9,还可以使用DECCARA 转义序列更改显示区域中所有字符的属性,如果未指定边界,则默认为整个屏幕。可以发送转义DECSACE
序列来确定这两个<top>;<left>
和<bottom>;<right>
坐标是第一个和最后一个字符还是矩形区域的角点。
例子:
\nprintf \'\\33[;;;;$r\'\n
Run Code Online (Sandbox Code Playgroud)\n将消除整个屏幕上的所有闪烁。
\n要消除屏幕上某些特定连续文本的闪烁,您需要知道该文本的第一个和最后一个字符的坐标。
\n您可以使用转义序列查询光标位置<ESC>[6n
。
使用bash
,您可以做到这一点并阅读其<ESC>[<y>;<x>R
使用以下命令读取其响应:
getpos() { IFS=$\'\\e[;\' read -rsdR -p $\'\\e[6n\' _ _ "$2" "$1"; }\n
Run Code Online (Sandbox Code Playgroud)\n假设用户没有同时或之前输入任何内容,其中:
\np
转义序列作为romptread
残疾人echo
-s
以便响应不会显示在屏幕上r
到R
d
。F
S
对任何<ESC>
, [
,字符进行字段分割;
,将结果字段存储在_
, _
,$2
和$1
变量中。所以你可以这样做:
\nprintf \'\\33[5m%s\\33[25m\\n\' \'Some earlier blinking text\'\ngetpos x1 y1; printf \'\\33[5m%s\\33[25m%s\' EXAMPLE; getpos x2 y2\nprintf \' \\33[5m%s\\33[25m\\n\' \'Some extra blinking text\'\necho \'Some more text\'\n
Run Code Online (Sandbox Code Playgroud)\n后来,假设没有滚动:
\nprintf \'\\33[%s;%s;%s;%s;25$r\' "$y1" "$x1" "$y2" "$x2"\n
Run Code Online (Sandbox Code Playgroud)\n在上述所有内容中,我们使用printf
而不是echo
使其可以跨不同的 shell 或不同的构建/版本/设置进行移植。通过printf
内置的 bash 和大多数其他printf
实现,您可以使用\\e
而不是\\33
.
\xc2\xb9 的支持远不如此处提到的其他转义序列广泛。另请注意,即使主机终端支持,tmux
也不支持它。screen
虽然可以说服他们将序列传递给主机,但这仍然无法在分割窗口中正常工作。