Dynamic Wallpaper 新手实战:半小时让 Linux 壁纸按时间自动切换

Dynamic Wallpaper 新手实战:半小时让 Linux 壁纸按时间自动切换

Dynamic Wallpaper 新手实战:半小时让 Linux 壁纸按时间自动切换

【免费下载链接】dynamic-wallpaperA simple bash script to set wallpapers according to current time, using cron job scheduler.项目地址: https://gitcode.com/gh_mirrors/dy/dynamic-wallpaper

如果你的 Linux 桌面从早到晚都挂着一张一模一样的壁纸,那么 Dynamic Wallpaper 这个轻量级 bash 脚本工具就是为你准备的——它借助 cron 任务调度器,让壁纸随当前时间自动流转:清晨是晨光,午后是晴空,入夜是灯火。下面这篇文章会带你走完从"拿到安装包"到"壁纸自动切换"的完整流程,全程只需要跟着命令行操作,不涉及任何编程基础。

开场:你的桌面凭什么不认识现在几点

设想一个常见的场景:下午三点阳光正好,你的屏幕却还停留在一张深夜的暗色壁纸,整个人的工作状态都被拉低了半截;而到了晚上加班时,屏幕又是刺眼的白昼图。人需要感知时间,桌面同样需要。

Dynamic Wallpaper 正是为了解决这个"桌面与时间脱节"的小烦恼而生。它本质上是一个简洁的 shell 脚本,内部准备了 24 套风格各异的壁纸集,每套按小时拆分为 24 张图(编号 0 到 23),脚本读取当前小时数,挑选对应编号的图片,再调用系统工具把这张图设为壁纸。听起来不复杂,但配合 cron 定时器后,效果就是每小时一次、全天不重样的视觉刷新。

从图中可以看到,像aurora这样的风格自带浓郁的夜晚氛围,极光在山峦与森林上空流动。如果这类画面能按你的作息时间出现在桌面上,工作与休息的界限都会清晰很多。接下来,我们就从安装开始,一步步把它跑起来。

上手:把工具装进系统,看到第一张壁纸

动手之前,先把三样依赖备齐

Dynamic Wallpaper 本身不负责"画壁纸",它只负责选图和调用工具,所以系统里必须先有它依赖的三个组件:feh(在窗口管理器下设置壁纸)、cron(提供定时调度能力)、xrandr(检测显示器,XFCE 桌面尤其需要)。脚本启动时会先做依赖检查,缺了任何一个都会直接报错退出,所以提前装好可以省去后面排错的工夫。

不同发行版装法略有差异,这里给出两个主流分支,按你的系统选择一条执行即可:

# Debian / Ubuntu 系:三个组件一条命令装齐 sudo apt install feh x11-xserver-utils cron # Arch Linux 系:注意包名是 cronie sudo pacman -S feh xorg-xrandr cronie

💡 小提示:如果你不确定自己是什么发行版,可以运行cat /etc/os-release查看ID字段,再对照上面的命令选择。

克隆仓库并执行安装脚本

依赖就绪后,下一步是获取项目本体。把它克隆到本地,进入目录后运行安装脚本。这一步的关键在于理解install.sh做了什么:它会把images图片目录和dwall.sh脚本复制到系统目录/usr/share/dynamic-wallpaper,并在/usr/bin下创建一个名为dwall的软链接。这意味着安装完成后,你在任何目录下敲dwall都能直接调用它。

# 克隆项目仓库到当前目录 git clone https://gitcode.com/gh_mirrors/dy/dynamic-wallpaper # 进入项目目录 cd dynamic-wallpaper # 给安装脚本添加执行权限后运行 chmod +x install.sh ./install.sh

安装脚本执行到最后会打印一行绿色的Installed Successfully,看到它说明文件已就位。安装期间需要输入 sudo 密码,属于正常现象。

验证安装:先试跑,再正式安装

如果担心装坏了系统目录,项目还贴心提供了一个test.sh。它在项目目录内直接运行、不写入任何系统路径,效果等同于正式版,非常适合用来"先尝后买"。建议按这个顺序走:先用test.sh确认某套风格的效果,满意后再执行./install.sh正式安装。

# 在项目目录内试跑,不修改系统文件 ./test.sh -s beach

无论 test.sh 还是安装后的 dwall,正确运行的输出都类似下面这样——先显示当前会话类型,再确认正在应用的风格名:

[*] Setting wallpaper in x11 (ubuntu) session, using : gsettings set org.gnome.desktop.background picture-uri [*] Using style : beach

从图中可以看到,beach风格的白天画面明亮通透,海面与天空层次分明。此刻你的桌面应该已经换成了这套风格里"当前小时"对应的那张图。第一次成功,就这么简单。

看一眼帮助菜单,认识全部风格

在正式配置自动切换之前,建议先摸清自己有哪些风格可选。运行dwall -h会打印一张帮助菜单,其中Available styles一行列出当前系统里全部已安装的风格名。这份清单以后会经常用到,尤其是当你忘记某个风格怎么拼写的时候。

# 打印帮助信息与全部可用风格 dwall -h

仓库自带的风格相当丰富:aurora极光、beach海滩、desert沙漠、forest森林、tokyo东京街景、mojave莫哈韦沙漠、firewatch山林守望……共 24 套,风格名即目录名,全部小写。你可以先随便挑两三套分别运行dwall -s <风格名>,找到最喜欢的那套再进入下一步。

实战:让壁纸按小时自动切换的完整配置

为什么单次运行还不够,必须借助 cron

到这一步,你运行的dwall -s beach只是在"此刻"换了一张壁纸,一小时后它不会自己再动。要让壁纸持续跟随时间变化,必须把它交给 cron 定时调度:脚本每小时被唤醒一次,读取当前小时数,换上新图。这正是这个项目设计时的核心用法——它天生就是给作业调度器准备的。

cron 的配置文件叫 crontab,里面每一行代表一个定时任务。我们要做的是写入一条"每小时的第 0 分钟执行一次 dwall"的任务。但直接写还不行,因为 cron 运行在 X 图形会话之外,它不知道你的显示器在哪里,所以必须先把环境变量喂给它。

先收集环境变量,再写入定时任务

手动执行dwall正常、放进 cron 却毫无反应,九成是环境变量缺失导致的。脚本需要用DISPLAY找到显示器,用DBUS_SESSION_BUS_ADDRESS连接桌面会话总线。先在终端里把这几个关键值打出来记好:

# 输出当前会话的环境变量,供写入 crontab 使用 echo "$SHELL | $PATH | $DISPLAY | $DESKTOP_SESSION | $DBUS_SESSION_BUS_ADDRESS | $XDG_RUNTIME_DIR"

以常见的输出为例:/usr/bin/bash | /usr/local/bin:/usr/bin | :0 | ubuntu | unix:path=/run/user/1000/bus | /run/user/1000。其中DISPLAY=:0表示第一块主显示器,XDG_RUNTIME_DIRDBUS_SESSION_BUS_ADDRESS是多显示器、GNOME 等环境下能否生效的关键。

把定时任务写进 crontab,并用两分钟验证

拿到变量值后,打开 crontab 编辑器写入任务。注意把命令里的环境变量值替换成你自己刚查到的内容,风格名也可以换成你喜欢的任意一套。

# 指定编辑器后打开 crontab 编辑界面 export EDITOR=vim crontab -e

在编辑器中新增下面这一行(env后面依次是环境变量和要执行的命令):

# 每小时第 0 分钟,带上环境变量执行 dwall,应用 beach 风格 0 * * * * env PATH=/usr/local/bin:/usr/bin DISPLAY=:0 DESKTOP_SESSION=ubuntu DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus" /usr/bin/dwall -s beach

保存退出后,用crontab -l确认任务确实写进去了,同时检查 cron 服务是否在运行:

# 列出当前用户的所有定时任务,确认刚才那一行存在 crontab -l # 查看 cron 服务运行状态 systemctl status cron

如果服务未启动,用sudo systemctl start cron启动,并用sudo systemctl enable cron设置开机自启。之后每到整点,壁纸就会自动切换一次。

对比上面两张东京街景就能直观理解这套机制的价值:白天画面是阳光下的街道,夜晚则是灯光点亮的街巷。同一风格、同一机位,不同时段不同气质,你的桌面从此有了"时间感"。

⚠️ 注意:如果你用的是 KDE、GNOME 这类桌面环境,dwall会调用对应的qdbusgsettings接口来换壁纸,因此请确保 crontab 里的DESKTOP_SESSION与你实际登录的会话名称一致,否则桌面环境可能识别不到命令来源。

进阶:把工具调教成你的私人风格

加入自己的壁纸集

自带的 24 套风格用腻了?完全可以换成你自己的照片。规则只有一个:图片必须按 0 到 23 命名(对应 24 个小时),格式为 jpg 或 png。图片不够 24 张也没关系,用符号链接补足即可。

# 第一步:在系统壁纸目录下创建自己的风格目录(假设叫 mywall) sudo mkdir -p /usr/share/dynamic-wallpaper/images/mywall # 第二步:把图片复制进去并改成 0.jpg、1.jpg……的格式 sudo cp ~/Pictures/photo_01.jpg /usr/share/dynamic-wallpaper/images/mywall/0.jpg sudo cp ~/Pictures/photo_02.jpg /usr/share/dynamic-wallpaper/images/mywall/1.jpg # 第三步:图片不够时,用软链接让多个小时共用同一张图 sudo ln -s /usr/share/dynamic-wallpaper/images/mywall/0.jpg /usr/share/dynamic-wallpaper/images/mywall/2.jpg

完成后直接运行dwall -s mywall,脚本会在Available styles里自动发现新风格。想每 15 分钟换一次照片幻灯片?把 crontab 里的时间字段从0 * * * *改成*/15 * * * *即可,语法完全通用。

用 pywal 让整个桌面配色跟着壁纸走

装好可选的pywal后,-p参数会让脚本在换壁纸的同时提取图片主色调,并同步应用到终端、状态栏等应用,实现"壁纸换、配色也换"的联动体验。先安装 pywal,再在 crontab 中为命令加上-p

# 安装 pywal(以 pip 为例) pip install pywal # 手动验证 pywal 模式是否正常 dwall -p -s sahara

如果输出正常、终端配色已变化,就把 crontab 里的命令改为/usr/bin/dwall -p -s sahara。💡 小提示:pywal 是可选依赖,不装也不影响核心换壁纸功能,装错版本或与系统冲突时可以随时卸载。

让登录开机后壁纸自动恢复

cron 只负责每小时切换,不负责你开机那一刻的画面。想要登录后立刻恢复上次的壁纸,有两种轻量做法:一是在 crontab 里加一条@reboot任务,二是创建一个 autostart 桌面文件。推荐前者,因为它和现有定时任务放一起管理,思路最统一:

# 打开 crontab 编辑器 crontab -e
# 追加一行:开机时立即应用一次 beach 风格 @reboot /usr/bin/dwall -s beach

把 HEIC 图片转换成可用格式

从 Dynamic Wallpaper Club 等站点下载的壁纸通常是.heic格式,脚本无法直接识别,需要先转成 jpg 或 png。安装转换工具后,用一行循环批量处理:

# Debian/Ubuntu 安装转换工具 sudo apt install libheif-examples # 进入存放 heic 文件的目录,批量转为 jpg cd ~/Downloads/heic_images for file in *.heic; do heif-convert "$file" "${file/%.heic/.jpg}"; done

转换完成后,按前面"添加自己的壁纸集"的步骤放入对应目录即可。

排障:遇到状况,先查这张速查表

即便每一步都按上文操作,也难免有环境差异导致的小状况。下面这张表汇总了最高频的几类问题,按"现象 → 原因 → 处理"三列对照排查,比逐条翻日志快得多:

症状常见原因快速处理
壁纸始终不自动切换定时任务没写入或 cron 服务未运行crontab -l确认任务存在;systemctl status cron检查服务并启动
手动执行正常、定时执行无反应cron 缺少 DISPLAY 等环境变量在 crontab 命令前补全env DISPLAY=:0 ...前缀
提示Invalid style name风格名拼写错误或目录不存在dwall -h查看合法风格清单,核对大小写
提示Could not find 'feh'依赖组件缺失按发行版安装 feh / xrandr / cron
Wayland 会话下不生效缺少 oguri 守护进程安装 oguri 并启动;Sway 用户先pkill swaybg再启用
XFCE 桌面换壁纸失败显示器编号与脚本默认值不一致运行xfconf-query -c xfce4-desktop -m观察屏幕参数并调整
重启后壁纸丢失未配置开机自启添加@reboot定时任务或 autostart 桌面文件

⚠️ 注意:当你解决了问题、向项目提交反馈时,附上echo $DESKTOP_SESSION的输出会非常有帮助——这是排查"环境识别失败"类问题最直接的信息。

收尾:从一张静态图,到一套会呼吸的桌面

回顾整条路径:你先备齐依赖、完成安装,跑通了第一次手动换壁纸;接着把dwall交棒给 cron,实现了每小时自动切换;再通过自建壁纸集、pywal 联动和开机自启,把它打磨成贴合自己习惯的工具。此刻再回头看看开头那个"桌面不认识时间"的困扰——它已经被这套"脚本 + 定时器"的组合轻松化解了。

如果还想继续深入,建议优先阅读项目目录里的README.md,其中包含各桌面环境的适配说明、更多壁纸资源的获取方式,以及dwall.sh脚本本身的分支逻辑——当你理解了它如何按DESKTOP_SESSION挑选设置器,就基本掌握了自行扩展的全部钥匙。愿你的桌面从此跟随晨昏流转,每一小时都有新的风景。

【免费下载链接】dynamic-wallpaperA simple bash script to set wallpapers according to current time, using cron job scheduler.项目地址: https://gitcode.com/gh_mirrors/dy/dynamic-wallpaper

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考