You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Nautilus的‘Set as Background’按钮调用自定义bash脚本?

如何让Nautilus的‘Set as Background’按钮调用自定义bash脚本?

嘿,这个问题我在Hyprland下也碰到过——Nautilus默认依赖GNOME的DBus壁纸门户接口,但Hyprland压根没实现这个,所以才会报那个错。既然你已经有能用的bash壁纸脚本,咱们有几种办法让Nautilus的「Set as Background」按钮乖乖调用它,挑适合你的来:

方法一:模拟DBus壁纸门户接口(推荐,保留默认按钮)

这个方法是让系统以为存在那个缺失的DBus接口,实际调用你的脚本,完美适配Nautilus的默认按钮:

  1. 写个DBus服务中间层
    因为bash脚本没法直接处理DBus调用,我们用Python写个简单的中间脚本(需要先装python-dbus和python-gi包)。创建~/.local/bin/wallpaper-portal.py,内容如下:
import dbus
import dbus.service
import subprocess
from dbus.mainloop.glib import DBusGMainLoop
import gi
gi.require_version('GLib', '2.0')
from gi.repository import GLib

class WallpaperPortal(dbus.service.Object):
    def __init__(self):
        bus_name = dbus.service.BusName('org.freedesktop.portal.Wallpaper', bus=dbus.SessionBus())
        dbus.service.Object.__init__(self, bus_name, '/org/freedesktop/portal/desktop')

    @dbus.service.method('org.freedesktop.portal.Wallpaper', in_signature='sbb', out_signature='u')
    def SetWallpaper(self, uri, show_preview, allow_modify):
        # 把Nautilus传的file://路径转成本地绝对路径
        local_path = uri.replace('file://', '')
        # 调用你的bash壁纸脚本,传入图片路径
        subprocess.run(['/path/to/your/actual-wallpaper-script.sh', local_path])
        # 按门户协议要求返回一个随机uint就行
        return 1

if __name__ == '__main__':
    DBusGMainLoop(set_as_default=True)
    portal = WallpaperPortal()
    loop = GLib.MainLoop()
    loop.run()

记得把/path/to/your/actual-wallpaper-script.sh换成你自己的脚本路径。

  1. 注册DBus服务
    创建~/.local/share/dbus-1/services/org.freedesktop.portal.Wallpaper.service,内容:
[D-BUS Service]
Name=org.freedesktop.portal.Wallpaper
Exec=/usr/bin/python3 ~/.local/bin/wallpaper-portal.py
User=%u
  1. 重启生效
    注销再登录,或者重启DBus会话,之后Nautilus点「Set as Background」就会触发你的脚本了。

方法二:给Nautilus加自定义脚本菜单(简单直接)

如果不想折腾DBus,直接给Nautilus加个右键菜单选项,虽然不是替换默认按钮,但用起来也方便:

  1. 创建脚本文件
    在~/.local/share/nautilus/scripts/下新建文件Set as Wallpaper,内容:
#!/bin/bash
# 获取Nautilus选中的图片路径
IMAGE_PATH="$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"
# 调用你的壁纸脚本
/path/to/your/actual-wallpaper-script.sh "$IMAGE_PATH"
  1. 加执行权限
    打开终端跑这个命令:
chmod +x ~/.local/share/nautilus/scripts/Set\ as\ Wallpaper
  1. 重启Nautilus
nautilus -q

之后右键图片,在「Scripts」菜单里就能看到这个选项,点它就会调用你的脚本。

方法三:监听GNOME背景设置变化

Nautilus默认会修改GNOME的gsettings背景项,我们可以监听这个变化,触发你的脚本:

  1. 写监听脚本
    创建~/.local/bin/gsettings-wallpaper-listener.sh,内容:
#!/bin/bash
# 初始化当前壁纸路径
current_uri=""

while true; do
    # 获取当前GNOME背景设置的URI
    new_uri=$(gsettings get org.gnome.desktop.background picture-uri | tr -d "'")
    # 如果路径变化了,调用脚本
    if [ "$new_uri" != "$current_uri" ]; then
        current_uri="$new_uri"
        local_path=${new_uri//file:\/\//}
        /path/to/your/actual-wallpaper-script.sh "$local_path"
    fi
    sleep 1
done
  1. 设置开机自启
    打开你的Hyprland配置文件~/.config/hyprland/hyprland.conf,加一行:
exec-once = ~/.local/bin/gsettings-wallpaper-listener.sh

重启Hyprland后,Nautilus点默认的「Set as Background」时,这个监听脚本就会触发你的壁纸脚本。

备注:内容来源于stack exchange,提问作者Bartek Masiak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 11:09:35