linux - BASH Shell 交互式 session - 如何修复 ASCII 艺术动画输出?

标签 linux bash shell animation ascii-art

我正在尝试为以下 ASCII 艺术设置动画。 (我现在有两个文件,以后可能会添加更多文件以获得更精细的动画。)

$ cat ~/aks1.txt
        \            RTX            /
         \                         /
          \       WAZUH LAB       /
           ]                     [    ,'|
           ]                     [   /  |
           ]___               ___[ ,'   |
           ]  ]\             /[  [ |:   |
           ]  ] \           / [  [ |:   |
           ]  ]  ]         [  [  [ |:   |
           ]  ]  ]__     __[  [  [ |:   |
           ]  ]  ] ]\ _ /[ [  [  [ |:   |
           ]  ]  ] ] (A) [ [  [  [ :===='
           ]  ]  ]_].nRn.[_[  [  [
           ]  ]  ]  HHUHH. [  [  [
           ]  ] /   `HN("N  \ [  [
           ]__]/     HNH  "  \[__[
           ]         NNN         [
           ]       / N/" \       [
           ]      /  N H  \      [
          /          N            \
         /           q,            \
        /                           \

$ cat ~/aks2.txt
        \            RTX            /
         \                         /
          \       WAZUH LAB       /
           ]                     [    ,'|
           ]                     [   /  |
           ]___               ___[ ,'   |
           ]  ]\             /[  [ |:   |
           ]  ] \           / [  [ |:   |
           ]  ]  ]         [  [  [ |:   |
           ]  ]  ]__     __[  [  [ |:   |
           ]  ]  ] ]\ _ /[ [  [  [ |:   |
           ]  ]  ] ] (A) [ [  [  [ :===='
           ]  ]  ]_].nRn.[_[  [  [
           ]  ]  ] .HHUHH  [  [  [
           ]  ] /  #")NH`   \ [  [
           ]__]/   " HNH     \[__[
           ]         NNN         [
           ]       / "\N         [
           ]         H N  \      [
          /      /     N   \      \
         /      /     ,p    \      \
        /                           \

到目前为止,这是我的代码:

if [[ -t 0 ]]; then
    old_tty=$(stty --save)
    stty raw -echo min 0
fi
while IFS= read -r REPLY; [[ -z "$REPLY" ]]; do
    clear
    cat ~/aks1.txt
    usleep 500000
    clear
    cat ~/aks2.txt
    ((c++)) && usleep 500000
done
if [[ -t 0 ]]; then
    stty "$old_tty"
fi
echo

优点:
  • 简单的方法/解决方案
  • 不需要复杂的变量替换(在 tput 杯屏幕位置)
  • 在按下 ANY 键之前效果很好,因此运行动画的生命周期不需要硬编码的 COUNTER 变量。
  • 动画是一种工作(动画正在发生,但输出渲染不完美)。

  • 缺点:
  • 动画输出为乱码/垃圾。

  • 如何修复输出?

    最佳答案

    当您切换到原始模式换行符 ( \n ) 时,不再将光标移回第一列。他们只将它向下移动。您必须打印回车符 ( \r ) 以重置列。

    您可以通过使用 sed 禁用将它们添加到每一行的末尾来做到这一点:

    sed 's/$/\r/g' ~/aks1.txt
    

    或者,您可以跳过切换到原始模式并将终端保留在默认状态。防止read来自阻止使用的命令 read -t 0添加 0 秒超时。如果用户没有按下任何键,它会立即返回而不是等待他们按下某些东西。
    until read -t 0; do
        ...
    done
    

    关于linux - BASH Shell 交互式 session - 如何修复 ASCII 艺术动画输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61239780/

    相关文章:

    linux - 如何使用 BASH 脚本在文本文件上创建动态 header

    shell - 第二个 www-data 是什么意思?

    bash - 为什么模式 "*.so?(.*)"在脚本中而不是在命令行中产生语法错误?

    linux - 为什么 find -regex 命令与 find | 不同格雷普?

    linux - 在 ext3 文件系统中一个文件夹可以容纳多少个文件?

    linux - 在 linux 中搜索具有相同部分内容的文件

    c - OpenCL C 程序给出奇怪的输出

    linux - 如何隔离一行文本的一部分以便将其用作变量

    regex - sed 或 perl 仅当第一个内部单词匹配时才删除外部括号

    linux - "zip -m"目录变空不删除