telometto Asked: 2023-01-17 12:09:33 +0800 CST2023-01-17 12:09:33 +0800 CST 2023-01-17 12:09:33 +0800 CST 是否可以让 bash 停止闪烁文本? 772 我一直在玩 bash,想知道如果我执行另一个命令是否有可能使闪烁的文本停止。例如echo -e '\033[5mEXAMPLE\033[0m'将输出一个闪烁的EXAMPLE文本;但是,我想知道如果执行第二个命令是否有可能使文本停止闪烁。 bash 2 个回答 Voted Best Answer Stéphane Chazelas 2023-01-17T12:34:03+08:002023-01-17T12:34:03+08:00 发送<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"; } 假设用户没有同时或之前输入任何内容,其中: 转义序列作为prompt发送 我们告诉readdisabled echowith-s所以响应不会显示在屏幕上 响应被读取r到R d分隔符。 FS在任何<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" 在以上所有内容中,我们使用printfinstead ofecho使其在不同的 shell 或不同的构建/版本/设置之间可移植。通过printf内置的 bash 和大多数其他printf实现,您可以使用\einstead of \33. ¹ 与此处提到的其他转义序列相比,它的支持范围要小得多。另请注意,既不tmux也不screen支持它,即使主机终端支持也是如此。虽然可以说服他们将序列传递给主机,但这仍然无法在拆分窗口中正常工作。 roaima 2023-01-17T12:35:54+08:002023-01-17T12:35:54+08:00 闪烁文字 tput blink 还原特征 tput sgr0 例子 tput blink; echo This is blinking text; tput srg0 或者 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您将简单地退回到近似值
发送
<ESC>[5m
序列告诉终端设置从现在开始显示的字符的闪烁属性。在大多数终端上,
<ESC>[25m
将其关闭,因为此后将发送的字符将关闭其闪烁属性。<ESC>[0m
, 与<ESC>[m
关闭所有字符再现属性相同,包括粗体、突出、颜色等。不仅仅是闪烁。发送这些序列不会改变已经显示的内容。
为了让
EXAMPLE
屏幕上的某处停止闪烁,您必须EXAMPLE
在相同位置发送一个新的闪烁并覆盖它。例如:
会显示一个闪烁的
EXAMPLE
,然后 5 秒后,将光标移回行首(CR 也就是\r
将光标移动到开头)并用不闪烁的 覆盖它EXAMPLE
。对于某些终端¹,还可以使用
<ESC><top>;<left>;<bottom>;<right>25$r
DECCARA 转义序列更改显示区域中所有字符的属性,如果未指定边界,则默认为整个屏幕。DECSACE
可以发送转义序列来决定这两个和<top>;<left>
坐标<bottom>;<right>
是第一个和最后一个字符还是矩形区域的角。例子:
将消除整个屏幕上的所有闪烁。
要消除屏幕上某些特定连续文本的闪烁,您需要知道该文本的第一个和最后一个字符的坐标。
<ESC>[6n
您可以使用转义序列查询光标位置。使用
bash
,您可以这样做并阅读其<ESC>[<y>;<x>R
响应:假设用户没有同时或之前输入任何内容,其中:
p
rompt发送read
disabledecho
with-s
所以响应不会显示在屏幕上r
到R
d
分隔符。F
S
在任何<ESC>
,[
,字符上划分;
字段,将结果字段存储在_
,_
,$2
和$1
变量中。所以你可以这样做:
后来,假设没有滚动:
在以上所有内容中,我们使用
printf
instead ofecho
使其在不同的 shell 或不同的构建/版本/设置之间可移植。通过printf
内置的 bash 和大多数其他printf
实现,您可以使用\e
instead of\33
.¹ 与此处提到的其他转义序列相比,它的支持范围要小得多。另请注意,既不
tmux
也不screen
支持它,即使主机终端支持也是如此。虽然可以说服他们将序列传递给主机,但这仍然无法在拆分窗口中正常工作。闪烁文字
还原特征
例子
或者
有了这个以及将光标向上移动 (
tput cuu1
) 甚至移动到绝对位置(tput cup Y X
- (0,0) 是左上角)的能力,您可以随意用非闪烁文本覆盖闪烁文本。值得阅读更多有关 terminfo 的内容;您甚至可以保存当前光标位置,移动到一个新位置来书写您的文本,然后恢复该位置。而且,如果您的终端不支持此功能,那么
$TERM
您将简单地退回到近似值