Как создать анимацию вращения, затем заменить ее некоторым текстом, а затем повторить с помощью Bash

Извините, если название не слишком информативное. Я хочу добиться следующей «анимации»:

- Song Name
\ Song Name    # all these 4 would stay on the same line by
| Song Name    # replacing each other every 0.5 seconds     
/ Song Name
current_window_title # then for 2 seconds the current window 
                     # title will be displayed

# repeat the animation from the start over and over

Надеюсь, вы понимаете. Я пытаюсь создать модуль для своего Polybar, который показывает проигрываемую песню, а затем показывает текущий заголовок окна. К сожалению, у меня нет опыта работы с Bash для достижения такого результата.

Пока мне удалось получить часть анимации песни, но когда дело доходит до объединения ее с 2-секундным отображением имени текущего окна в той же строке, это такая головная боль.

#!/bin/bash

chars="/-\|"
while sleep 0.5; do
    echo -en "${chars:$(( i=(i+1) % ${#chars} )):1}" "Song Name" "\r"
done

Ребята, не могли бы вы мне подсказать или помочь, пожалуйста? Пытался сделать сам 2 дня, но толком не разобрался. Возможно ли это хотя бы?

Заранее благодарю.

4
задан 20 April 2021 в 21:15

2 ответа

Вы очень близки.

#!/bin/bash

chars="/-\|"

while sleep 0.5; do
    tput el
    echo -en "${chars:$(( i=(i+1) % ${#chars} )):1}" "Song Name" "\r"
    (($i == 3)) && sleep 0.5 && tput el && echo -en "$(xdotool getactivewindow getwindowname)" "\r" && sleep 1.5     
done
  • tput el очищает строку для следующего вывода. Хотя для Полибара она может не понадобиться ... Но она есть на всякий случай.
  • (($ i == 3)) при выполнении этого условия встретились, команды после него в той же строке, разделенные && , будут выполняться одна за другой. 3 - сколько символов в chars = "/ - \ |" , начиная с 0, поэтому 0,1,2,3 ... Имейте это в виду при изменении строки в символах .

Обратите внимание, что xdotool getactivewindow getwindowname будет получать имя текущего активного окна ... Это означает, что активное окно каждый раз запускается "$ (xdotool getactivewindow getwindowname)" .. .Это может быть вкладка вашего браузера, например, если вы нажмете на нее в это время. К сожалению, это поведение аналогично другим инструментам, таким как xprop и wmctrl ... обходным путем было бы объявить переменную перед циклом while, например, так window = "$ ( xdotool getactivewindow getwindowname) " и echo эта переменная внутри цикла, чтобы она оставалась прежней, избегая других активных окон позже ... Или вы можете установить статическое имя и echo это если вы знаете имя заранее.

2
ответ дан 23 April 2021 в 23:20

Попробуйте,

#!/bin/bash

chars="/-\|"
while :; do
    for (( i=0; i<${#chars}; i++ )); do
        printf '%s %s\r' "${chars:$i:1}" "Song Name"
        sleep 0.5
    done
    # Clear line and print window name
    printf '\033[2K%s\r' "$(xdotool getactivewindow getwindowname)"
    sleep 2
    # Go up one line and clear line
    printf "\033[2K"

done
# Add newline in the very end if you like
echo

Это комбинация:

Вам может понадобиться установить xdotool:

sudo apt install xdotool
4
ответ дан 23 April 2021 в 23:20

Другие вопросы по тегам:

Похожие вопросы: