Lam*_*ros 2 shell command-line
由于找不到更好的词,我将其称为 ASCII 动画。我指的是例如一个加载栏,就像在pacman
(arch包管理器)中一样,像这样开始......
[ ]
Run Code Online (Sandbox Code Playgroud)
并把时间转向这个......
[#### ]
Run Code Online (Sandbox Code Playgroud)
根据我的理解,stdout
我似乎无法理解这个看似简单的功能。我期望......
[ ]
[# ]
[### ]
...
Run Code Online (Sandbox Code Playgroud)
我不明白的是它如何能够在 之上打印stdout
(如果它甚至这样做的话)。
我们有时认为终端只是显示文本,但它们实际上更像浏览器,以控制字符和 ANSI 终端转义码的形式呈现自己的小标记。
简单的单行动画通常使用回车控制字符来完成。通过写入回车符,光标将返回到最左边距,因此您可以根据需要多次重写该行。
显然您会使用循环,但为了清楚起见,这里写了一个示例:
{
printf '[## ]'
sleep 1
printf '\r[### ]'
sleep 1
printf '\r[#### ]'
}
Run Code Online (Sandbox Code Playgroud)
对于更高级的动画,您可以通过将特殊的 ANSI 转义序列写入文本来任意定位光标。该tput
工具在 shell 脚本中对此很有帮助,并且tput cup 4 50
将输出 ANSI 序列以将光标移动到第 4 行第 50 列。这相当于并且printf '\x1B[4;50H'
只是将一段魔术文本写入终端。
以下是用于星空动画的功能(按 ctrl-c 退出):
while sleep 0.1
do
tput cup $((RANDOM%LINES)) $((RANDOM%COLUMNS))
printf "*"
done
Run Code Online (Sandbox Code Playgroud)
甚至工具也喜欢top
通过nano
仔细编写文本和控制字符来创建颜色、线条、刷新列表等来显示它们所显示的内容。