将键盘快捷键绑定到 bash 功能以中断睡眠?

Bind keyboard shortcut to bash function to interrupt sleep?

我有一组 .jpg 背景图像,想用作我的 i3-gaps 桌面的背景。目前,我的墙纸 i3 配置文件中有这两行。

exec --no-startup-id randomwallpaper
bindsym $mod+i exec --no-startup-id feh --bg-scale --randomize /home/user/Pictures/bgart/*.jpg

这是我的随机壁纸脚本。它使用 feh 设置图像并使用 wal 创建基于它的配色方案。

#!/bin/bash
cd /home/user/Pictures/bgart
for file in $(ls); do
        shopt -s nullglob
        for i in *.jpg; do
                feh --bg-scale --randomize /home/user/Pictures/bgart/$i
                wal -q -i $i
                sleep 300
        done
done

启动时,随机壁纸启动,每 5 分钟壁纸随颜色方案变化。不过,我也可以按 Win+I 手动切换到随机壁纸。是否可以添加某种触发器来中断循环?也许将脚本作为一个函数并添加一个键来调用它?这样,我就可以拥有上面的脚本 运行,如果我对墙纸感到厌倦,我可以使用 Win+I 切换到另一个,并且在 5 分钟后仍然可以更改。

除非你用内置睡眠修改了你的 bash,否则你可以终止睡眠命令。然后脚本将继续执行下一个命令,就好像 sleep 正常终止一样。唯一棘手的部分是确定要杀死的正确进程。这里我假设你的系统上只有一个 randomwallpaper 进程 运行:

exec --no-startup-id randomwallpaper
bindsym $mod+i exec --no-startup-id sh -c 'pkill -P $(pgrep -ox randomwallpaper) sleep'

顺便说一句;您的脚本可以使用一些改进。例如,变量 file 未使用,并且 --randomize 无效,因为您只提供了一张图片。

#!/bin/bash
shopt -s nullglob
cd /home/user/Pictures/bgart
while true; do
  i=$(shuf -en1 ./*.jpg)
  if [ -n "$i" ]; then
    feh --bg-scale "$i"
    wal -q -i "$i"
  fi
  sleep 300
done