Извините, если название не слишком информативное. Я хочу добиться следующей «анимации»:
- 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 дня, но толком не разобрался. Возможно ли это хотя бы?
Заранее благодарю.
Вы очень близки.
#!/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
это если вы знаете имя заранее.
Попробуйте,
#!/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