是否可以让 bash 停止闪烁文本?

tel*_*tto 0 bash prompt

我一直在玩 bash,想知道如果我执行另一个命令是否可以使闪烁的文本停止。例如echo -e '\033[5mEXAMPLE\033[0m'会输出闪烁的EXAMPLE文字;但是,我想知道如果执行第二个命令是否可以使文本停止闪烁。

Sté*_*las 5

发送<ESC>[5m序列告诉终端设置从现在开始显示的字符的闪烁属性。

\n

在大多数终端上,<ESC>[25m将其关闭,因为此后发送的字符将关闭其闪烁属性。,与关闭所有<ESC>[0m字符呈现属性相同,包括粗体、突出、颜色等。不仅仅是闪烁。<ESC>[m

\n

发送这些序列不会改变已经显示的内容。

\n

为了使EXAMPLE屏幕上的某个位置停止闪烁,您必须EXAMPLE在同一位置发送一个新的闪烁并覆盖它。

\n

例如:

\n
printf \'\\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

\n
\n

<ESC><top>;<left>;<bottom>;<right>25$r 对于某些终端\xc2\xb9,还可以使用DECCARA 转义序列更改显示区域中所有字符的属性,如果未指定边界,则默认为整个屏幕。可以发送转义DECSACE序列来确定这两个<top>;<left><bottom>;<right>坐标是第一个和最后一个字符还是矩形区域的角点。

\n

例子:

\n
printf \'\\33[;;;;$r\'\n
Run Code Online (Sandbox Code Playgroud)\n

将消除整个屏幕上的所有闪烁。

\n

要消除屏幕上某些特定连续文本的闪烁,您需要知道该文本的第一个和最后一个字符的坐标。

\n

您可以使用转义序列查询光标位置<ESC>[6n

\n

使用bash,您可以做到这一点并阅读其<ESC>[<y>;<x>R使用以下命令读取其响应:

\n
getpos() { IFS=$\'\\e[;\' read -rsdR -p $\'\\e[6n\' _ _ "$2" "$1"; }\n
Run Code Online (Sandbox Code Playgroud)\n

假设用户没有同时或之前输入任何内容,其中:

\n
    \n
  • 转义序列作为p转义序列作为rompt
  • \n
  • 我们告诉read残疾人echo-s以便响应不会显示在屏幕上
  • \n
  • 响应被读取rR d
  • \n
  • FS对任何<ESC>, [,字符进行字段分割;,将结果字段存储在_, _,$2$1变量中。
  • \n
\n

所以你可以这样做:

\n
printf \'\\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

后来,假设没有滚动:

\n
printf \'\\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.

\n
\n

\xc2\xb9 的支持远不如此处提到的其他转义序列广泛。另请注意,即使主机终端支持,tmux也不支持它。screen虽然可以说服他们将序列传递给主机,但这仍然无法在分割窗口中正常工作。

\n