【问题标题】:How to make a text blink in shell script如何在 shell 脚本中使文本闪烁
【发布时间】:2022-03-24 16:53:01
【问题描述】:

我在下面有这段代码:

echo "\033[33mTitle of the Program\033[0m"

将颜色变为黄色。

如何让“程序标题”文本闪烁?

【问题讨论】:

    标签: bash blink


    【解决方案1】:

    尝试添加-e,如果没有它就无法工作

    您可能需要将-e 选项添加到echo(至少在我使用的所有或大多数系统上都需要这样做)。以下将告诉您的系统闪烁文本:

    echo  -e "\033[5mTitle of the Program\033[0m"
    

    你可以有闪烁的颜色

    你不必选择要么黄色闪烁。你可以吃蛋糕也可以吃:

    echo  -e "\033[33;5mTitle of the Program\033[0m"
    

    某些系统会忽略闪烁代码

    您的系统可能会忽略闪烁代码——这似乎很常见。如果您想突出显示文本,但忽略闪烁,您可以使用 7 反转颜色:

    echo  -e "\033[33;7mTitle of the Program\033[0m"
    

    或者您可以使用闪烁的颜色反转(和黄色):

    echo  -e "\033[33;5;7mTitle of the Program\033[0m"
    

    【讨论】:

    • 无法使用我的 bash :(
    【解决方案2】:

    能否让blink工作取决于终端模拟器系统本身是无关紧要的。

    问题中给出的示例很接近,只需更改转义序列即可与任何POSIX shell“工作”:

    echo  "\033[33;5mTitle of the Program\033[0m"
    

    建议的 -e 是不需要的(它是一个 bashism,非标准,通常不需要)。将 7(反向)更改为 5(闪烁)即可完成所要求的操作。

    您可以使用tput,而不是硬编码转义,例如,

    printf '%s%s%s%s' "$(tput setaf 3)" "$(tput blink)" "Title of the Program" "$(tput sgr0)"
    

    同样的效果,有两个不同:

    • 该表达式可以说更具可读性,
    • 实际上使用了已知的终端功能,但是
    • 假设您使用的是合适的终端描述,即$TERM

    例如 VTE(用于各种skins 的库,例如 gnome-terminal)不支持闪烁(并且可以在各种错误报告中找到其开发人员对该主题的意见)。使用infocmp显示对应的终端能力说明,加上其他一些区别:

    $ infocmp vte xterm
    comparing vte to xterm.
        comparing booleans.
            km: F:T.
            mc5i: F:T.
            npc: F:T.
        comparing numbers.
        comparing strings.
            blink: NULL, '\E[5m'.
            cnorm: '\E[?25h', '\E[?12l\E[?25h'.
            cvvis: NULL, '\E[?12;25h'.
            enacs: '\E)0', NULL.
            is2: '\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8', '\E[!p\E[?3;4l\E[4l\E>'.
            kb2: '\E[E', '\EOE'.
            kfnd: '\E[1~', NULL.
            kslt: '\E[4~', NULL.
            mc0: NULL, '\E[i'.
            mc4: NULL, '\E[4i'.
            mc5: NULL, '\E[5i'.
            rep: NULL, '%p1%c\E[%p2%{1}%-%db'.
            rmacs: '^O', '\E(B'.
            rmcup: '\E[2J\E[?47l\E8', '\E[?1049l'.
            rmm: NULL, '\E[?1034l'.
            rs2: '\E7\E[r\E8\E[m\E[?7h\E[!p\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[?25h', '\E[!p\E[?3;4l\E[4l\E>'.
            setb: NULL, '\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m'.
            setf: NULL, '\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m'.
            sgr: '\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p5%t;2%;%?%p7%t;8%;%?%p1%p3%|%t;7%;m%?%p9%t\016%e\017%;', '%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m'.
            sgr0: '\E[0m\017', '\E(B\E[m'.
            smacs: '^N', '\E(0'.
            smcup: '\E7\E[?47h', '\E[?1049h'.
            smm: NULL, '\E[?1034h'.
    

    如果你碰巧使用 KDE konsole,差异会更长(尽管konsole 碰巧支持blink)。

    【讨论】:

      【解决方案3】:

      只需使用printf 而不是echo

      printf "\e[6;33mTitle of the Program\e[0m"
      

      这行打印Title of the Program,带有黄色闪烁的文本。

      【讨论】:

        【解决方案4】:

        一个使 bash 脚本中的行闪烁的小工作

        for (( i=0;i<=3;i++))
        do
        #Below line will deleted the before printed line
        echo -en "\033[1A"
        echo -en "EmpNo:$empno already exists\n";
        sleep 0.4s;
        #Below line to print a blank line
        echo -en "\033[1A"
        echo -en "                                                            \n";                                                                         
        sleep 0.2s;
        done
        echo -en "\033[2A"
        echo -en "                                                            \n";
        echo -en "\033[1A"
        echo -en "Enter the empno       : "; read empno1;
        

        【讨论】:

          【解决方案5】:

          据我所知,它的意思是:

          echo " \033[5mTitle of the Program\033[0m"
          

          唯一的变化就是标题前的33m被5m代替了。见Ansi Escape Codes

          请注意,有些系统会过滤掉闪烁,因为它真的很烦人。您的里程可能会有所不同。

          【讨论】:

          • tput blink 能为您带来什么?您可能希望通过管道转换为十六进制 odhexdumpxxd 或类似工具:tput blink | xxd
          • 我刚刚运行了 tput blink,它产生了等效的结果(但没有工作)。大多数终端不支持闪烁,因为它很烦人。
          • “许多人(包括我自己)强烈反对“blink”属性。幸运的是,它在我所知道的任何终端仿真器中都不起作用。” -- linuxselfhelp.com/howtos/Bash-Prompt/Bash-Prompt-HOWTO-6.html
          • 只是把它扔在那里,但我旁边的 IBM 3161 终端确实支持闪烁。我只花了大约半个小时来弄清楚为什么 irssi 的默认主题会在各处显示闪烁的文本。 (如果有人通过google找到这个,解决方案就是这个主题github.com/asenchi/irssi-theme-doc/blob/master/colorless.theme
          • misc.flogisoft.com/bash/… ... konsole 和 xterm 支持根据此列表闪烁。我测试了 konsole,它可以工作。
          【解决方案6】:
          1. 导出变量
          export YELLOWIT="\e[1;3;5;43m"
          export NC="\e[0m"
          
          1. echo 中使用以获得所需的效果
          echo -e "\n${YELLOWIT}### RESTORE FROM USB - Firefox Bookmarks ###${NC}\n"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-01-30
            • 2022-10-17
            • 2015-05-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多