【问题标题】:Is there a way to terminate a running process (zscroll) after the end of a while loop in a bash script有没有办法在bash脚本中的while循环结束后终止正在运行的进程(zscroll)
【发布时间】:2021-09-16 08:28:21
【问题描述】:

我正在编写一个小脚本,它查看 spotify 的输出以确定音乐是停止还是重新开始,在每次重新开始播放后刷新标题和艺术家。有时,歌曲信息有点太长,所以我使用 zscroll 来滚动浏览。

#!/usr/bin/env bash

maxlength=50


spotify --show-console 2>&1 |
grep -P --line-buffered "Playing music" |
while read line 
do  
    if [[ $line == *"true"* ]]; then
        sleep 0.3
        playerctl --player=spotify metadata --format '{{ title }} - {{ artist }}' |
        zscroll -l "$maxlength" 
#       cut -c 1-$maxlength
#       cut works wonderful, i am just missing a bit of text, so its not an option
    else
        echo "music stopped!"
    fi
done

这很好用,但是,只适用于第一首歌。转到下一个,它只是继续滚动浏览旧歌曲(我怀疑甚至没有新的迭代,因为 zscroll 过程还没有完成) - 有没有办法在每次迭代时终止正在运行的 zscroll 过程循环?

如果是关于操作系统 - 我使用 arch btw

【问题讨论】:

    标签: bash while-loop


    【解决方案1】:

    您的解决方案的问题是:zscroll 应该如何知道标题何时停止播放?您使用playerctl 读取当前播放的标题,以便将其传输到zscrollzscroll 获取文本并显示它。永远。没有人通知zscroll音乐已停止。

    按照作者的意图运行zscroll 可能更容易。请参阅zscroll手册页中的“不断更新播放歌曲”示例。

    创建一个脚本spotify.sh,它使用playerctl 读取当前播放的标题。

    #!/usr/bin/env bash
    
    case $(playerctl --player=spotify status) in
      Playing)
        playerctl --player=spotify metadata --format '{{ title }} - {{ artist }}'
      ;;
      Paused)
        echo "music stopped!"
      ;;
    esac
    

    然后开始spotify。 (我必须在我的系统上添加--no-zygote 选项以阻止spotify 立即崩溃。)

    spotify &
    

    然后使用脚本运行zscroll

    zscroll -n f -u t -U 1 ./spotify.sh
    

    zscroll 每秒一次无限循环调用spotify.sh 脚本并检查更改。每当脚本的输出发生变化时,都会显示新的文本。无需解析spotify 的控制台输出。这种解决方案的缺点是,playerctl 会为一首 4 分钟的歌曲执行大约 480 次。

    您的解决方案只会在必要时调用playerctl。但是您的方法要求您必须在后台运行 zscroll 才能从控制台输出中读取下一个事件。每当有新事件到来时,您必须终止旧的 zscroll 后台作业,以使用新标题文本启动新作业。

    【讨论】:

      猜你喜欢
      • 2017-08-17
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多