抱歉,标题描述得不够清楚。我想实现以下“动画”:
- 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,3
chars
请注意,xdotool getactivewindow getwindowname
将获取当前活动窗口的名称...这意味着每次"$(xdotool getactivewindow getwindowname)"
运行时活动窗口...例如,如果您当时单击它,则可能是您的浏览器选项卡。不幸的是,这种行为与其他工具(如xprop
和)相同wmctrl
...一种解决方法是在 while 循环之前声明一个变量,就像这样window="$(xdotool getactivewindow getwindowname)"
,并将echo
此变量放在循环内,这样它之后保持不变,避免以后出现其他活动窗口...或者,echo
如果您事先知道名称,您可以设置一个静态名称。