BASH Shell Interactive Session - Как исправить вывод художественной анимации ASCII? - PullRequest
3 голосов
/ 16 апреля 2020

Я пытаюсь оживить следующее искусство 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

Плюсы :

  1. Простой подход / решение
  2. Подстановка сложных переменных не требуется (в местах расположения экрана tput cup)
  3. Работает хорошо, пока ЛЮБАЯ клавиша не нажимается, поэтому нет жестко запрограммированная переменная COUNTER необходима для запуска анимации.
  4. Анимация - это своего рода работа (анимация выполняется, но вывод не отображается идеально).

Минусы:

  1. Вывод анимации ЗВУКОВОЙ / ХИТЫЙ.

Как исправить выход?

Ответы [ 4 ]

3 голосов
/ 16 апреля 2020

Когда вы переключаетесь в необработанный режим, новые строки (\n) больше не перемещают курсор назад к первому столбцу. Они только перемещают это вниз по линии. Вы должны напечатать возврат каретки (\r), чтобы сбросить столбец.

Вы можете сделать это, отключив добавление их в конец каждой строки с помощью sed:

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

В качестве альтернативы, Вы можете пропустить переключение в сырой режим и оставить терминал в состоянии по умолчанию. Чтобы предотвратить блокировку команды read, используйте read -t 0, чтобы добавить 0-секундный тайм-аут. Если пользователь не нажал клавишу, он сразу же вернется, вместо того, чтобы ждать, пока он что-то нажмет.

until read -t 0; do
    ...
done
1 голос
/ 16 апреля 2020

Эта версия отлично работает для меня на Debian / Xterm:

function animate {
    local aks1="$(cat ~/aks1.txt)"
    local aks2="$(cat ~/aks2.txt)"
    local c
    for (( c=0; c < 5; c++ )); do
        read -rsn1 -t .001 && return
        clear; printf "%s\n" "$aks1"; sleep .5
        clear; printf "%s\n" "$aks2"; sleep .5
    done
    echo
}
setterm -cursor off
animate
setterm -cursor on
0 голосов
/ 16 апреля 2020

Это "моя тема") попробуйте это.

#!/bin/bash

sprites=( "$(cat aks1.txt)" "$(cat aks2.txt)" )

XY () { printf "\e[$2;${1}H$3"; }
animation () {
    for sprite in "${sprites[@]}"; {
        sleep 0.5
        XY 1 1 "$sprite"
    }    
    animation
}

animation

И отметьте это и это проекты, чтобы получить больше идей об анимации)

0 голосов
/ 16 апреля 2020

Решение для Animate ASCII ART, прерывание, как только любая клавиша нажата (используя alias способ):

alias animate_arun='until read -t 0; do clear && cat ~/aks1.txt && sleep .5 && clear && cat ~/aks2.txt && sleep .5; done; echo;'

Установка указанного выше псевдонима в ~/.bash_profile и вызов псевдонима animate_arun сделал трюк для любой новой интерактивной оболочки входа в систему.

Справочный пост: Анимируйте ASCII-арт с помощью tput cup, пока пользователь не нажмет клавишу

...