【问题标题】:How does a terminal "ASCII animation" work?终端“ASCII 动画”如何工作?
【发布时间】:2021-04-29 22:17:47
【问题描述】:

由于没有更好的词,我将其称为 ASCII 动画。我指的是例如一个加载栏,比如pacman(arch 包管理器),它的开头是这样的......

[          ]

把时间交给这个……

[####      ]

根据我对stdout 的理解,我似乎无法理解这个看似简单的功能。我希望......

[          ]
[#         ]
[###       ]
...

我不明白的是它如何能够在 stdout 上打印,(如果它甚至这样做的话)。

【问题讨论】:

标签: shell command-line


【解决方案1】:

我们有时认为终端只是显示文本,但实际上它们更像浏览器,以控制字符和 ANSI 终端转义码的形式呈现自己的小标记。

简单的单行动画通常使用回车控制字符完成。通过写回车,光标会返回到最左边的空白处,因此您可以在该行上再次写入任意次数。

您显然会使用循环,但为了清楚起见,这里有一个示例:

{
  printf '[##    ]'
  sleep 1
  printf '\r[###   ]'
  sleep 1
  printf '\r[####  ]'
}

对于更高级的动画,您可以例如通过将特殊的 ANSI 转义序列编写为文本来任意定位光标。 tput 工具在 shell 脚本中对此很有帮助,tput cup 4 50 将输出一个 ANSI 序列以将光标移动到第 4 行第 50 列。这相当于 printf '\x1B[4;50H' 并且只是将魔法文本的 sn-p 写入终端。

这是用于星空动画的此功能(ctrl-c 退出):

while sleep 0.1
do
  tput cup $((RANDOM%LINES)) $((RANDOM%COLUMNS))
  printf "*"
done

即使像 topnano 这样的工具也可以通过仔细编写文本和控制字符来创建颜色、线条、刷新列表等来显示它们所显示的内容。

【讨论】:

    猜你喜欢
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 2023-04-08
    • 2012-11-17
    • 1970-01-01
    • 2010-12-26
    • 2021-06-08
    相关资源
    最近更新 更多