AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 732012
Accepted
telometto
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 2 个回答
  • 83 Views

2 个回答

  • Voted
  1. 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支持它,即使主机终端支持也是如此。虽然可以说服他们将序列传递给主机,但这仍然无法在拆分窗口中正常工作。

    • 4
  2. 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您将简单地退回到近似值

    • 1

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve