如何创建旋转动画,然后用一些文本替换它,然后使用 Bash 重复它

如何创建旋转动画,然后用一些文本替换它,然后使用 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

你们能给我一些指点或帮助吗?我自己尝试了两天,但还是搞不懂。至少有可能吗?

先感谢您。

答案1

尝试,

#!/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

答案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清除行以进行下一个输出。虽然您可能不需要它用于 Polybar...但它在那里以防万一。
  • (($i == 3))当满足这个条件时,同一行上以 分隔的后面的命令&&将一个接一个地运行。是从 0 开始的3中有多少个字符所以...在更改 中的字符串时请记住这一点。chars="/-\|"0,1,2,3chars

请注意,xdotool getactivewindow getwindowname将获取当前活动窗口的名称...这意味着每次"$(xdotool getactivewindow getwindowname)"运行时活动窗口...例如,如果您当时单击它,则可能是您的浏览器选项卡。不幸的是,这种行为与其他工具(如xprop和)相同wmctrl...一种解决方法是在 while 循环之前声明一个变量,就像这样window="$(xdotool getactivewindow getwindowname)",并将echo此变量放在循环内,这样它之后保持不变,避免以后出现其他活动窗口...或者,echo如果您事先知道名称,您可以设置一个静态名称。

相关内容